[JavaScript 刷题] 搜索 - 省份数量, leetcode 547

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 省份数量, leetcode 547相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 搜索 - 省份数量, leetcode 547

这道题写到后面感觉写傻了……思想滑坡了……

题目地址:

Number of Provinces

题目如下:

There are n cities. Some of them are connected, while some are not. If city a is connected directly with city b, and city b is connected directly with city c, then city a is connected indirectly with city c.

A province is a group of directly or indirectly connected cities and no other cities outside of the group.

You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the ith city and the jth city are directly connected, and isConnected[i][j] = 0 otherwise.

Return *the total number of provinces*.

这道题之前好像叫找朋友,不过现在重命名了,但是题目内容一样。

解题思路

这道题就是 leetcode 200 & 695 的变种题,但是实现稍微有一点不同,leetcode 200 & 695 是属于在 2D 数组中四个方向移动,这里需要找到下一个数组的 rowNum,然后遍历那一行。

参考数组

[
  [1, 0, 0, 1],
  [0, 1, 1, 0],
  [0, 1, 1, 1],
  [1, 0, 1, 1],
];

图解如下:

  1. grid[0][0] 开始

    这个图也是变种之一,之前解解过的其他题目 x 轴和 y 轴是不一样的值,但是这里的 x 和 y 都可以视为元素自身,这也就是为什么当 x === y 的时候, grid[i][y] === 1——自己肯定就是要连接自己的。

    蓝色代表 正在遍历的城市

  2. 能看到 A 和 D 是朋友/同省城市,这个时候要调到 D 这一行继续搜寻相关联的朋友/城市

    row = 3 的情况,这时候可以看到,grid[3][1]grid[3][3] 都已经标记为黑色,即 已经访问过的城市,这里 grid[3][2]正在遍历的城市

    可以看到,CD 也是直接关联的,所以下一步就是跳到 C 这一行继续搜索相关联的城市。

  3. 重复该步骤一直到所有的城市都被遍历过

在这个过程中需要使用一个数组去单独保存已经访问过的城市,直接在原数组中进行操作……也不是不可以,但是关联性真的就太复杂了。

以步骤 2 出现的图为例,当 grid[0][0]grid[0][3] 形成了直接关联,那么 grid[3][0]grid[3][3] 就都需要被标记为 已经访问过。但是 DC 又有直接关联。

如此往复,很容易就被绕进去了。

使用 JavaScript 解题

因为是变种题,所以解题方法与 leetcode 200 & 695 并不是完全一致,DFS 部分重要修改的还算多。

const searchCities = (grid, curr, size, visited) => ... 这个函数中,这个 curr 每次代表的是当前的 row,里面的 for 循环会迭代当前 row 中的所有元素。

当然,因为是 n x n 的数组,而且 x 轴与 y 轴一样,想换个方向理解也行……

const searchCities = (grid, curr, size, visited) => 
  if (visited[curr]) return;
  visited[curr] = 1;

  for (let i = 0; i < size; i++) 
    if (grid[curr][i] && !visited[i]) 
      searchCities(grid, i, size, visited);
    
  
;

/**
 * @param number[][] isConnected
 * @return number
 */
var findCircleNum = function (isConnected) 
  if (isConnected.length === 0) return 0;

  const size = isConnected.length;
  const visited = new Array(size);
  let ans = 0;

  for (let i = 0; i < size; i++) 
    if (visited[i]) continue;
    searchCities(isConnected, i, size, visited);
    ans++;
  

  return ans;
;

以上是关于[JavaScript 刷题] 搜索 - 省份数量, leetcode 547的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79