1表示陆地,0表示水,
找出水距离最近的陆地的最远距离(每个水到所有陆地的最小距离中选最大的)。
思路:
DP
如果只有左边有陆地,那么dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1, 然后从所有dp[i][j]中找最大的,
这个比较好理解。
如果只有右边有陆地,那么dp[i][j] = min(dp[i+1][j], dp[i][j+1]) + 1, 然后从所有dp[i][j]中找最大的,
这个也比较好理解。
现在左右都有陆地,所以把上面两个结合起来,
先从左上角到右下角遍历一遍,再从右下角到左上角遍历一遍。
最大距离定义为201, 因为题目中n<=100.
res要初始化为-1, 应对全1的情况。
public int maxDistance(int[][] grid) {
int n = grid.length;
int[][] dp = new int[n][n];
int res = -1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == 1) continue;
dp[i][j] = 201;
if(i > 0) dp[i][j] = Math.min(dp[i][j], dp[i-1][j]+1);
if(j > 0) dp[i][j] = Math.min(dp[i][j], dp[i][j-1]+1);
}
}
for(int i = n-1; i >= 0; i--) {
for(int j = n-1; j >= 0; j--) {
if(grid[i][j] == 1) continue;
if(i < n-1) dp[i][j] = Math.min(dp[i][j], dp[i+1][j]+1);
if(j < n-1) dp[i][j] = Math.min(dp[i][j], dp[i][j+1]+1);
res = Math.max(res, dp[i][j]);
}
}
return res == 201 ? -1 : res;
}