在图里面,要求多少个分割的区域,最大的区域面积等,都可以使用dfs,这比bfs更快。
注意标记已访问过的位置!
695.岛屿的最大面积
求最大的连续“1”的面积
注意面积加一的时机,访问过的位置变为0
class Solution {
int dfs(int[][]grid, int x, int y){
int area = 0;
int []dx = new int[]{0,0,1,-1};
int []dy = new int[]{1,-1,0,0};
for(int i = 0; i < 4; i++){
if(x + dx[i] >= 0 && x + dx[i] < grid.length && y + dy[i] >= 0 && y + dy[i] < grid[0].length){
if(grid[x + dx[i]][y + dy[i]] == 1){
grid[x + dx[i]][y + dy[i]] = 0;
area += dfs(grid, x + dx[i], y + dy[i]);
}
}
}
return area + 1;
}
public int maxAreaOfIsland(int[][] grid) {
int max = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1){
grid[i][j] = 0;
max = Math.max(max, dfs(grid, i, j));
}
}
}
return max;
}
}
200.岛屿数量
求被“0”分割的“1”的区域个数
访问过的位置变为0
class Solution {
void dfs(char [][]grid, int x, int y){
int []dx = new int[]{0,0,-1,1};
int []dy = new int[]{1,-1,0,0};
for(int i = 0; i < 4; i++){
if(x + dx[i] >= 0 && x + dx[i] < grid.length && y + dy[i] >= 0 && y + dy[i] < grid[0].length){
if(grid[x + dx[i]][y + dy[i]] == '1'){
grid[x + dx[i]][y + dy[i]] = '0';
dfs(grid, x + dx[i], y + dy[i]);
}
}
}
}
public int numIslands(char[][] grid) {
int num = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == '1'){
num++;
dfs(grid, i, j);
}
}
}
return num;
}
}
547.朋友圈
这是道比较有趣的题,我是结合了dfs和bfs来解。
对于每个人,找出他的朋友加到队列中,然后再对队列内的朋友找他的朋友。队列为空时朋友圈数量加一。
我是用对角线的元素,即M[i][i]来标记是否访问过这个人,少用了个数组。
class Solution {
public int findCircleNum(int[][] M) {
int num = 0;
for(int i = 0; i < M.length; i++){
if(M[i][i] == 1){
Queue<Integer> queue = new LinkedList<>();
queue.add(i);
while(!queue.isEmpty()){
int temp = queue.poll();
M[temp][temp] = 0;
for(int j = 0; j < M[0].length; j++){
if(M[temp][j] == 1){
queue.add(j);
M[temp][j] = 0;
M[j][temp] = 0;
}
}
}
num++;
}
}
return num;
}
}