水位上升的泳池中游泳——二分的应用

水位上升的泳池中游泳

题目描述:

链接: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值