//递归需要关注,每次递归达到的目的,包括影响了哪些全局值,或者改变什么全局状态;
//另外是输入条件和边界结束条件,输入条件保证递归的输入环境是否一致;
//结束条件,表明什么时候结束,避免无限递归。
//最后是递归在函数中的位置,递归在函数开始,中间,末尾
//递归函数在函数中不同的位置,影响点:1.函数前面部分对递归输入环境的影响;2.其递归的全局结果对函数其他部分的影响。
//3.递归结果会影响到递归的输入环境吗?可能会影响一些全局的状态;
LeetCode 547
https://leetcode-cn.com/problems/number-of-provinces/
解答:
int findCircleNum(vector<vector<int>>& isConnected) {
int numCircles = 0;
if(isConnected.empty()){
return numCircles;
}
int numCity = isConnected[0].size();
vector<bool> flag(numCity,false);//标志城市是否被找过
for(int i=0;i<numCity;i++){
if(!flag[i]){
flag[i]=true;
findCircleFromPoint(i,isConnected,flag);
numCircles++;
}
}
return numCircles;
}
//找到与i城市相连的所有城市
void findCircleFromPoint(int i, vector<vector<int>>& isConnected, vector<bool>& flag){
int numCity = isConnected[0].size();
if(i>=numCity || i<0){
return;
}
for(int j=0;j<numCity;j++){
if(j!=i && isConnected[i][j]){
flag[j]=true;
//i和j相邻
isConnected[i][j] = 0;
//避免重复搜到i
isConnected[j][i] = 0;
findCircleFromPoint(j,isConnected,flag);
}
}
}