leetcode
leetcode 3001 ~ 3050
省份数量

省份数量

难度:

标签:

题目描述

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递归时,你如何保证不会因为过深的递归导致栈溢出?
在深度优先搜索中确实存在递归栈溢出的风险,尤其是当数据规模很大时。为了防止这种情况,可以采取以下措施:1. 优化递归深度,例如通过减少不必要的递归调用。2. 在可能的情况下使用迭代版本的DFS,利用显式栈来管理状态而非依赖系统调用栈。3. 在某些编程环境中,可以考虑增加系统栈的大小限制。4. 对于特别大的数据集,考虑使用非递归的图遍历方法,如广度优先搜索(BFS)。
🦆
给定的矩阵 `isConnected` 是否总是保证为正方形矩阵,即行数和列数相等?如果不是会怎么处理?
题目中的矩阵 `isConnected` 通常是一个正方形矩阵,因为它表示的是城市之间的连接状态,其中矩阵的行和列都代表同样的城市集合。如果不是正方形矩阵,则可能表示输入数据有误或问题描述不正确,因为在城市间的连接矩阵中,行和列的数量不等将无法正确表示城市间的相互关系。在实际应用中,如果遇到这种情况,应首先验证输入数据的有效性并修正或报错。
🦆
在DFS中,如何处理城市自己与自己的连接(即矩阵的对角线元素)?这是否影响省份的计数?
在DFS中,矩阵的对角线元素(即城市自己与自己的连接)通常应当设为1,表示每个城市至少与自己是连通的。这种设置不影响省份的计数,因为DFS搜索时是基于城市间是否有直接或间接的连接进行的,对角线元素为1仅确认了城市自连的基本事实,不会导致额外的省份计数。在DFS的实现中,通常也不会单独对一个城市进行访问,而是查看与其他城市的连接状态。

相关问题