[JavaScript 刷题] 搜索 - 省份数量, leetcode 547
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 省份数量, leetcode 547相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 搜索 - 省份数量, leetcode 547
这道题写到后面感觉写傻了……思想滑坡了……
题目地址:
题目如下:
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],
];
图解如下:
-
从
grid[0][0]
开始这个图也是变种之一,之前解解过的其他题目 x 轴和 y 轴是不一样的值,但是这里的 x 和 y 都可以视为元素自身,这也就是为什么当
x === y
的时候,grid[i][y] === 1
——自己肯定就是要连接自己的。蓝色代表 正在遍历的城市
-
能看到 A 和 D 是朋友/同省城市,这个时候要调到 D 这一行继续搜寻相关联的朋友/城市
即
row = 3
的情况,这时候可以看到,grid[3][1]
和grid[3][3]
都已经标记为黑色,即 已经访问过的城市,这里grid[3][2]
是 正在遍历的城市。可以看到,
C
和D
也是直接关联的,所以下一步就是跳到C
这一行继续搜索相关联的城市。 -
重复该步骤一直到所有的城市都被遍历过
在这个过程中需要使用一个数组去单独保存已经访问过的城市,直接在原数组中进行操作……也不是不可以,但是关联性真的就太复杂了。
以步骤 2 出现的图为例,当 grid[0][0]
与 grid[0][3]
形成了直接关联,那么 grid[3][0]
与 grid[3][3]
就都需要被标记为 已经访问过。但是 D
与 C
又有直接关联。
如此往复,很容易就被绕进去了。
使用 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