水位上升的泳池中游泳
题目描述:
链接:leetcode778
题目大概的意思是在一个N×N的泳池中,有N×N个高度不一的泳池,现在开始下雨了,每单位时间水位上升一格,你现在在泳池的左上方,你只能游向被泳池淹没的位置,假设你游泳的时间可不计,问要等待多久才能游到泳池的右下方。
示例输入:[[0,2],[1,3]]
0 2
1 3
示例输出:3
二分思路
题意简化即为需要等待多少时间,左上角和右下角之间出现通路
那么可以先求出最高平台max,然后做二分,即先求mid=(0+max)/2,测试经过mid单位时间后能否出现通路,如果可以则继续测**(mid+max)/2**,如果不可以则测**(0+mid)/2**,直到求出最后的答案
示例代码
class Solution {
int n;
public static int[][] dir = new int[][]{{0,1} , {0,-1} , {1,0} , {-1,0}};
public int swimInWater(int[][] grid) {
this.n = grid.length;
int max = 0;
for (int[] ints : grid) {
int temp = Arrays.stream(ints).max().getAsInt();
if(temp>max){
max = temp;
}
}
int left = 0 , right = max;
int mid = max;
while (left<right){
mid = (left+right)/2;
int[][] map = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = grid[i][j]-mid;
if(map[i][j]<0){
map[i][j] = 0;
}
}
}
if(isChecked(map)){
right = mid;
}else {
left = mid+1;
}
}
return right;
}
public boolean isChecked(int[][] map){
if(map[0][0]>0 || map[n-1][n-1]>0){
return false;
}
int[][] flag= new int[n][n];
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{0,0});
while (!queue.isEmpty()){
int[] location = queue.poll();
for (int[] ints : dir) {
int x = location[0]+ints[0];
int y = location[1]+ints[1];
if(x==n-1 && y==n-1){
return true;
}
if(x>=0 && x<n && y>=0 && y<n && flag[x][y] == 0 && map[x][y]==0){
flag[x][y] = 1;
queue.add(new int[]{x,y});
}
}
}
return false;
}
}
更多内容可关注:panrh.com