547. 省份数量
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
有 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
示例 2:
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
提示:
1 <= n <= 200
n == isConnected.length
n == isConnected[i].length
isConnected[i][j] 为 1 或 0
isConnected[i][i] == 1
isConnected[i][j] == isConnected[j][i]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-provinces
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
动态规划:与“岛屿数量“类似。设置一个记录是否访问过节点的boolean数组,然后开始遍历节点。如果没被访问过则递归记录访问过程,并且记录一次省份数量。
递归函数中首先将本次的节点置为true表示访问过该节点了,然后遍历全部节点,递归访问与该节点相连并且没有被访问过的节点。
注意:如果递归中for循环里的if一直不能成立,意味着该节点只有自己和自己相连。
class Solution {
public int findCircleNum(int[][] isConnected) {
int count = 0;
boolean visited [] = new boolean[isConnected.length];//记录是否已被访问过
for(int i = 0; i < isConnected.length; i++){
if(!visited[i]){//还没被访问过则访问
dfs(isConnected, i, visited);
count ++;
}
}
return count;
}
void dfs(int[][] isConnected, int i, boolean [] visited){
visited[i] = true;
for(int j = 0; j < isConnected.length; j++){
if(isConnected[i][j] == 1 && !visited[j]){
dfs(isConnected, j, visited);
}
}
}
}
总结
上一篇: 深度优先搜索中等 NC109 岛屿数量
下一篇: 1983 等式问题
推荐阅读
-
如何使用MySQL查询某个列中相同值的数量统计_MySQL
-
文科400分能上的师范大学有哪些?(含多省份,2021年参考)
-
2021年多少分能上二本?(含河南、广东、四川、山东、湖北等省份预测)
-
2021警校高考预计分数线(含多省份)?最低分的二本警察学校名单汇总
-
二本最低的师范大学理科公立2021年参考(含河南、湖南等省份)
-
Android编程实现canvas绘制饼状统计图功能示例【自动适应条目数量与大小】
-
2021年300分可以考什么大学?(含广东、山东、河南、内蒙古、安徽等省份)
-
2021年理科考211大学要多少分?(含山西、广东、陕西等省份)
-
iOS实现自定义购物车角标显示购物数量(添加商品时角标抖动 Vie)
-
2021年400分左右的本科大学:理科400分能上二本吗(陕西、辽宁、安徽等省份)