LeetCode 1162. 地图分析(打卡第二十九天)

题目

  1. 地图分析
    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。

我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。

如果我们的地图上只有陆地或者海洋,请返回 -1。

示例 1:
在这里插入图片描述

输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释:
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。
示例 2:

在这里插入图片描述

输入:[[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释:
海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。

提示:

1 <= grid.length == grid[0].length <= 100
grid[i][j] 不是 0 就是 1

代码

public class Solution {
	static int dx[]= {0,0,-1,1};
	static int dy[]= {1,-1,0,0};
	public static int maxDistance(int[][] grid) {
		//不会写诶,又是抄作业的一天
		int ans=-1;
		//BFS
		//广度优先遍历
		//从每一个海洋出发,搜查他周围的岛屿(可想而知时间复杂度会很高)
		for(int i=0;i<grid.length;i++) {
			for(int j=0;j<grid[0].length;j++)
				if(grid[i][j]==0)//
					ans=Math.max(ans, BFS(grid,i,j));
		}
		;
		return ans;
    }
	private static int BFS(int[][] grid, int i, int j) {
		// TODO Auto-generated method stub
		Queue<int[]> q=new LinkedList<>();
		//记录数组Mem
		int[][] m=new int[grid.length][grid[0].length];
		m[i][j]=1;
		int ans=0;
		q.add(new int[] {i,j,0});
		while(!q.isEmpty()) {
			int[] t=q.remove();
			int xH=t[0],yH=t[1],l=t[2];
			for(int k=0;k<4;k++) {
				//判断旁边情况
				int x=xH+dx[k];
				int y=yH+dy[k];
				if(!(x>=0&&x<grid.length&&y>=0&&y<grid[0].length))
					continue;
				if(m[x][y]==0) {
					m[x][y]=1;
					q.add(new int[]{x,y,l+1});
					if(grid[x][y]==1)
						return l+1;
				}
			}
		}
		return -1;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值