一、DFS(一样的时空复杂度)

#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param m int整型vector<vector<>>
     * @return int整型
     */
    void dfs(vector<vector<int>>& m,int nowCity,vector<bool>& vis){
        vis[nowCity] = true;// 标记当前城市为已访问
        for (int i = 0; i < m.size(); i++) {
            // 如果当前城市与其他城市相连 且 其他城市未被访问过
            if (m[nowCity][i] == 1 && !vis[i]) {
                dfs(m, i, vis);// 继续深度优先搜索
            }
        }
    }
    int citys(vector<vector<int>>& m) {
        int citysCount = 0;// 城市群的数量

        vector<bool> vis(m.size(),false);// 记录城市是否已经被访问过

        for (int i = 0; i < m.size(); i++) {
            if (!vis[i]) {// 如果当前城市未被访问过
                dfs(m, i, vis);// 从当前城市开始进行深度优先搜索
                citysCount++; // 城市群数量加一
            }
        }

        return citysCount;
    }

};

算法思想:

使用深度优先搜索(DFS)算法来遍历所有城市,然后统计城市群的数量。

时间复杂度:

遍历所有城市需要O(n)的时间复杂度,每个城市进行深度优先搜索的时间复杂度为O(n),所以总的时间复杂度为O(n^2)

空间复杂度:

需要额外的矩阵空间来存储城市是否被访问过的信息,所以空间复杂度为O(n)。

二、BFS(一样的时空复杂度)

#include <vector>
#include <queue>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param m int整型vector<vector<>>
     * @return int整型
     */
    void bfs(vector<vector<int>>& m, int start, vector<bool>& vis) {
        queue<int> q;
        q.push(start);// 将起始城市加入队列
        vis[start] = true;// 标记起始城市为已访问

        while (!q.empty()) {
            int nowCity = q.front();
            q.pop();

            for (int i = 0; i < m.size(); i++) {
                // 如果当前城市与其他城市相连 且 其他城市未被访问过
                if (m[nowCity][i] == 1 && !vis[i]) {
                    q.push(i);// 将相连的城市加入队列
                    vis[i] = true;// 标记相连的城市为已访问
                }
            }
        }
    }
    int citys(vector<vector<int>>& m) {
        int citysCount = 0;// 城市群的数量

        vector<bool> vis(m.size(), false); // 记录城市是否已经被访问过

        for (int i = 0; i < m.size(); i++) {
            if (!vis[i]) {// 如果当前城市未被访问过
                bfs(m, i, vis);// 从当前城市开始进行深度优先搜索
                citysCount++; // 城市群数量加一
            }
        }

        return citysCount;
    }

};


算法思想:

使用广度优先搜索(BFS)算法来遍历所有城市,然后统计城市群的数量。从一个起始城市开始,将其加入队列,然后依次访问队列中的城市,并将其相连的未访问过的城市加入队列,直到队列为空。

时间复杂度:

遍历所有城市需要O(n)的时间复杂度,每个城市进行广度优先搜索的时间复杂度为O(n),所以总的时间复杂度为O(n^2)。

空间复杂度:

需要额外的队列空间来存储城市是否被访问过的信息和队列,所以空间复杂度为O(n)。