1. 997. 找到小镇的法官
将每个人视为点的话,法官是那个入度为n-1,出度为0的人
为节省空间,可用一个数组记录,投票–,被投票++,只有法官最后结果为n-1,
找不到返回-1
int findJudge(int N, vector<vector<int>>& trust) {
vector<int> in(N+1,0);
for(auto vec:trust){
in[vec[0]]--;
in[vec[1]]++;
}
int judge=-1;
for(int i=1;i<=N;i++){
if(in[i]==N-1){
judge=i;
break;
}
}
return judge;
}
2. 200. 岛屿数量
深度优先遍历,和树的遍历好像,但判空条件变为超出数组范围,为防止重复遍历,要将遍历过的地方进行标记,置为2
int numIslands(vector<vector<char>>& grid) {
int num=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
dfs(grid,i,j);
num++;
}
}
}
return num;
}
void dfs(vector<vector<char>>& grid,int r,int c){
if(r<0||r>=grid.size()||c<0||c>=grid[0].size()||grid[r][c]!='1'){
return ;
}
grid[r][c]='2';
dfs(grid,r+1,c);
dfs(grid,r-1,c);
dfs(grid,r,c+1);
dfs(grid,r,c-1);
}
3. 695. 岛屿的最大面积
返回自身加四周岛屿面积,递归调用
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxNum=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]==1){
maxNum=max(maxNum,dfs(grid,i,j));
}
}
}
return maxNum;
}
int dfs(vector<vector<int>>& grid,int r,int c){
if(r<0||r>=grid.size()||c<0||c>=grid[0].size()||grid[r][c]!=1){
return 0;
}
grid[r][c]=2;
int up=dfs(grid,r-1,c);
int down=dfs(grid,r+1,c);
int left=dfs(grid,r,c-1);
int right=dfs(grid,r,c+1);
return 1+up+down+left+right;
}