题解 61| DFS/BFS实现连通分量的统计#城市群数量#
城市群数量
https://www.nowcoder.com/practice/71cde4dee669475f94d8d38832374ada
一、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)。
2024考研数据结构 文章被收录于专栏
本人考研刷算法题,立此专栏练习强化。