持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 547. 省份数量 】- JavaScript(DSF+并查集)
题目描述
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中
isConnected[i][j] = 1表示第 i 个城市和第 j 个城市直接相连,而isConnected[i][j] = 0表示二者不直接相连。返回矩阵中 省份 的数量。
示例 1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
DFS深度优先搜索
思路:dfs, 遍历所有城市,对于每个城市,假如这个城市没有被访问过,就从这个城市开始搜索,找到与这个城市相连的全部城市。遍历完全部城市后,即可得到连通分量的总数。
function findCircleNum(isConnected: number[][]): number {
const len=isConnected.length
const visited=Array(len).fill(false)
let count=0
const dfs=(i)=>{
visited[i]=true
const cur=isConnected[i]
for(let j=0;j<len;j++){
if(cur[j]&&!visited[j]){
dfs(j)
}
}
}
for(let i=0;i<len;i++){
if(!visited[i]){
dfs(i)
count++
}
}
return count
};
并查集
其实上面的思路和并查集的思路也很相似,都是利用了一个visited数组。例如这个矩阵是一个无向图的邻接矩阵,对每个成员进行遍历,找到其朋友关系的连接并标记一下,每找到一个朋友就要以此为成员进行dfs,找到一个大的朋友圈关系。
var findCircleNum = function(isConnected) {
const provinces = isConnected.length;
const parent = new Array(provinces).fill(0);
for (let i = 0; i < provinces; i++) {
parent[i] = i;
}
for (let i = 0; i < provinces; i++) {
for (let j = i + 1; j < provinces; j++) {
if (isConnected[i][j] == 1) {
union(parent, i, j);
}
}
}
let circles = 0;
for (let i = 0; i < provinces; i++) {
if (parent[i] === i) {
circles++;
}
}
return circles;
};
const union = (parent, index1, index2) => {
parent[find(parent, index1)] = find(parent, index2);
}
const find = (parent, index) => {
if (parent[index] !== index) {
parent[index] = find(parent, parent[index]);
}
return parent[index];
}
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤