(补)20200911:力扣204周周赛题解下

力扣204周周赛题解下

题目

3.1568. 使陆地分离的最少天数
在这里插入图片描述

思路与算法

  1. 本周周赛第三题勉强可以看看,第四题超出我目前的水平,跳过。第三题是一个典型的dfs或者bfs的题目,连通岛屿或分割岛屿的同类型题目,注意到答案只能是0,1,2就基本结束了。注意书写。见代码

代码实现


class Solution {
    
    
	int m, n;
	boolean[][] used;
	// 表示上下左右
	private static final int[][] directions = {
    
     {
    
     0, 1 }, {
    
     0, -1 }, {
    
     -1, 0 }, {
    
     1, 0 } };

	public int minDays(int[][] grid) {
    
    
		m = grid.length;
		n = grid[0].length;
		used = new boolean[m][n];
		if (numOfLand(grid)) {
    
    
			return 0;
		} else {
    
    
			// 枚举 去掉其中一个1看能不能满足
			for (int i = 0; i < m; i++) {
    
    
				for (int j = 0; j < n; j++) {
    
    
					if (grid[i][j] == 1) {
    
    
						grid[i][j] = 0;
						if (numOfLand(grid)) {
    
    
							return 1;
						}
						grid[i][j] = 1;
					}
				}
			}
			return 2;
		}
	}

	public boolean numOfLand(int[][] grid) {
    
    
		// 计算是否有多个连通块,或者0个连通块
		int count = 0;
		used = new boolean[m][n];
		for (int i = 0; i < m; i++) {
    
    
			for (int j = 0; j < n; j++) {
    
    
				if (!used[i][j] && grid[i][j] == 1) {
    
    
					count++;
					dfs(grid, i, j);
				}
			}
		}
		return count > 1 || count == 0;
	}

	public void dfs(int[][] grid, int i, int j) {
    
    
		used[i][j] = true;
		for (int k = 0; k < 4; k++) {
    
    
			int x = i + directions[k][0];
			int y = j + directions[k][1];
			if (inside(x, y) && !used[x][y] && grid[i][j] == 1) {
    
    
				dfs(grid, x, y);
			}
		}
	}

	public boolean inside(int x, int y) {
    
    
		return x >= 0 && x < m && y >= 0 && y < n;
	}
}

写在最后

冲!

猜你喜欢

转载自blog.csdn.net/qq_36828395/article/details/108558116