方法一:深度优先
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
=>isConnected中包含几个元素就代表有几个城市=>明显有三个
[1,1,0]=>第一个和第一个城市相连,第一个城市与第二个城市相连,第一个城市与第三个城市不相连
[1,1,0]=>第二个和第一个城市相连,第二个城市与第二个城市相连,第二个城市与第三个城市不相连
[0,0,1]=>第三个与第一个城市不相连,第三个城市与第二个城市不相连,第三个城市与第三个城市相连
========>返回省份:2(即独立的城市圈)
//方法一:深度优先=>类比:前中后序遍历
//一点点的往下找,然后再往回找
//一根树枝找到黑,然后再返回
class Solution {
public:
void dfs(vector<vector<int>>& isConnected,vector<int>& visited,int n,int i)
{
for(int j=0;j<n;j++)
{
if(isConnected[i][j]==1&&!visited[j]){
visited[j]=1;//=>true
dfs(isConnected,visited,n,j);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
vector<int> visited(n);
int count=0;//计数器
for(int i=0;i<n;i++)
{
if(!visited[i]){
dfs(isConnected,visited,n,i);
count++;//找到一个省份
}
}
return count;
}
};
方法二:广度优先
一层一层的找
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<int> visited(n);
int count = 0;
queue<int> q;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
q.push(i);
while (!q.empty()) {
int k = q.front(); q.pop();
visited[k] = 1;
for (int j = 0; j < n; j++) {
if (isConnected[k][j] == 1 && !visited[j]) {
q.push(j);
}
}
}
count++;
}
}
return count;
}
};
方法三:并查集
暂时不会