省份数量
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 28 ms, 内存: 16.9 MB
/*
* 思路:使用Java Stream和队列来实现广度优先搜索(BFS)。
* 通过遍历所有城市,如果一个城市没有被访问过,
* 则将其添加到队列中并进行BFS,标记所有与该城市直接或间接相连的城市。
* 每次开始新的BFS时,省份数量加1。
*/
import java.util.*;
import java.util.stream.IntStream;
public class Solution {
public int findCircleNum(int[][] isConnected) {
int n = isConnected.length;
boolean[] visited = new boolean[n];
int provinces = (int) IntStream.range(0, n)
.filter(i -> !visited[i])
.peek(i -> bfs(isConnected, visited, i))
.count();
return provinces;
}
private void bfs(int[][] isConnected, boolean[] visited, int i) {
Queue<Integer> queue = new LinkedList<>();
queue.add(i);
while (!queue.isEmpty()) {
int city = queue.poll();
visited[city] = true;
IntStream.range(0, isConnected.length)
.filter(j -> isConnected[city][j] == 1 && !visited[j])
.forEach(queue::add);
}
}
}
解释
方法:
此题解使用了深度优先搜索(DFS)来确定省份数量。矩阵 `isConnected` 表示城市间的连接状态。我们维护一个 `visited` 数组来记录已经访问过的城市。对于每个城市,如果它还没有被访问过,就从这个城市开始进行深度优先搜索,并将搜索到的所有城市标记为已访问。这样可以确保通过间接连接也能访问到的所有城市都被遍历一次,形成一个省份。每次从未访问的城市开始新的DFS都表示发现了一个新的省份,因此每次启动DFS后,省份计数增加。
时间复杂度:
O(n^2)
空间复杂度:
O(n)
代码细节讲解
🦆
在处理DFS递归时,你如何保证不会因为过深的递归导致栈溢出?
▷🦆
给定的矩阵 `isConnected` 是否总是保证为正方形矩阵,即行数和列数相等?如果不是会怎么处理?
▷🦆
在DFS中,如何处理城市自己与自己的连接(即矩阵的对角线元素)?这是否影响省份的计数?
▷