原题
你现在手里有一份大小为 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
解法
思想
左上,右下两遍动态规划。
时间复杂度:O(4*N^2) = O(N^2)
代码
class Solution {
public int maxDistance(int[][] grid) {
int [][]dp=new int [grid.length][grid[0].length];
int i,j;
int ans=0;
for(i=0;i<grid.length;i++)
for(j=0;j<grid.length;j++)
dp[i][j]=200;
for(i=0;i<grid.length;i++)
for(j=0;j<grid[0].length;j++)
{
if(grid[i][j]==1)
dp[i][j]=0;
if(i<grid.length-1)
dp[i+1][j]=Math.min(dp[i][j]+1,dp[i+1][j]);
if(j<grid[0].length-1)
dp[i][j+1]=Math.min(dp[i][j]+1,dp[i][j+1]);
}
for(i=grid.length-1;i>=0;i--)
for(j=grid[0].length-1;j>=0;j--)
{
if(i>=1)
dp[i-1][j]=Math.min(dp[i-1][j],dp[i][j]+1);
if(j>=1)
dp[i][j-1]=Math.min(dp[i][j]+1,dp[i][j-1]);
}
for(i=0;i<grid.length;i++)
for(j=0;j<grid[0].length;j++)
ans=Math.max(ans,dp[i][j]);
if(ans==0||ans==200)
return -1;
return ans;
}
}
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode1162-%e5%9c%b0%e5%9b%be%e5%88%86%e6%9e%90/