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

力扣204周周赛题解下

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

3.1568. 使陆地分离的最少天数
(补)20200911:力扣204周周赛题解下_第1张图片

思路与算法

  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;
	}
}

写在最后

冲!

你可能感兴趣的:(leetcode学习记录篇,leetcode,算法,dfs)