两个几乎一模一样的题,比赛前几天才写过省份的题,结果比赛的时候这道题就忘记怎么写了!
只知道做过。┭┮﹏┭┮
先看一下省份数量:
思路:
dfs + 访问数组【用来记录该城市是否被访问过】+ 记录是否为同一个城市的变量 provinces
代码:
class Solution {
public:
void dfs(vector<vector<int>>& isConnected, vector<int>& visited, int cities, int i) {
for (int j = 0; j < cities; j++) {//从它本身开始,查看与哪些城市相连
if (isConnected[i][j] == 1 && !visited[j]) {//如果满足条件
visited[j] = 1;//将此时的访问数组记为1
dfs(isConnected, visited, cities, j);//查看相连的城市又与哪个城市相连
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int cities = isConnected.size();//表示城市个数
vector<int> visited(cities);//城市访问数组
int provinces = 0;//记录省份数量
for (int i = 0; i < cities; i++) {//从第一个城市开始
if (!visited[i]) {//查看该城市是否被访问过,没有被访问过就继续
dfs(isConnected, visited, cities, i);//进行深搜,查看它可以与哪些城市相连
provinces++;
//每从一个城市出发到结束,省份就+1;
//如果 下一个城市 还有未访问的就继续走dfs,如果都被访问过了,此时就不用dfs了
//直接provinces就是结果
}
}
return provinces;
}
};
再来看一下竞赛题:
该题表示,如果两个摄像头之间的距离小于或等于2,就表示摄像头为一组,可以被一个负责人管。不满足条件的就需要多出一个负责人。
问题:给定 负责人 n 判断 人手够不够
思路:只需要将上题 dfs中的判断条件改一下,另外外层加上一个判断条件就行了
isConnected[i][j] <=2