leedCode:地图分析

题目:

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

import java.util.ArrayDeque;
import java.util.Queue;

public class MaxDistance {
	
	//方便处理元素上下左右的元素数据
    //简化代码
	int[][] moves = {
	        {-1, 0}, {1, 0}, {0, -1}, {0, 1},
	    };
	
	public int maxDistance(int[][] grid) {
	    int N = grid.length;

	    Queue<int[]> queue = new ArrayDeque<>();
	    // 将所有的陆地格子加入队列
	    for (int i = 0; i < N; i++) {
	        for (int j = 0; j < N; j++) {
	            if (grid[i][j] == 1) {
	                queue.add(new int[]{i, j});
	            }
	        }
	    }

	    // 如果地图上只有陆地或者海洋,返回 -1
	    if (queue.isEmpty() || queue.size() == N * N) {
	        return -1;
	    }


	    int distance = -1; // 记录当前遍历的层数(距离)
	    while (!queue.isEmpty()) {
	        distance++;
            //获取队列数据数目  用来取数据用
	        int n = queue.size();
	        for (int i = 0; i < n; i++) { 
	            int[] node = queue.poll();
	            int r = node[0];
	            int c = node[1];
                //四个方位的元素
	            for (int[] move : moves) {
	                int r2 = r + move[0];
	                int c2 = c + move[1];
	                if (inArea(grid, r2, c2) && grid[r2][c2] == 0) {
                        //防止重复访问
	                    grid[r2][c2] = 2;
	                    queue.add(new int[]{r2, c2});
	                }
	            }
	        }
	    }

	    return distance;
	}

	// 判断坐标 (r, c) 是否在网格中
	boolean inArea(int[][] grid, int r, int c) {
	    return 0 <= r && r < grid.length 
	        && 0 <= c && c < grid[0].length;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值