leetcode1162-地图分析

0代表海洋,1代表陆地。题目要求是找到每个海洋的距离最近的陆地的距离,并且选出其中的最大值。正常思路是从每个0出发,去找陆地,然后计算距离,最终选出满足条件的的数即可。但是肯定会超时。
采用BFS,是从1出发去找0,找到0之后就把当前位置变为1。
用一个队列存储所有1的位置,然后依次弹出,处理每个为1的点,就是向四个方向分析。然后把四个方向的点更新后再添加到队列中,参与弹出和处理。这样就保证了一步一步走,满足BFS的特性。
其实我也有点没想明白,这里会不会存在某一个点先到某一个0位置,并更新了该位置的值,而远方的某个点迟一些才到达该位置,因此无法更改该位置的值,恰好这个位置的距离才是正确的。
要明白,题意中是要寻找最近距离中的最大值。用BFS也就保证了能到达这个位置的点大家都同时达到,说白了,就是同一层的时候,大家更新的distance都是一样的。留到最后的也就是最终的赢家。

class Solution {
    public int maxDistance(int[][] grid) {
        int[] x = new int[]{1,-1,0,0};
        int[] y = new int[]{0,0,1,-1};
        int distance = 0;
        int n = grid.length;
        Queue<int[]> q = new LinkedList<>();
        for(int i = 0;i<n;i++){
            for(int j = 0;j<n;j++){
                if(grid[i][j]==1){
                    q.offer(new int[]{i,j,0});
                }
            }
        }
        if(q.size()==0 || q.size()==n*n) return -1;
        while(!q.isEmpty()){
            int[] tmp = q.poll();
            int x1 = tmp[0];
            int y1 = tmp[1];
            int distance1 = tmp[2];
            distance = Math.max(distance,distance1);
            for(int i=0;i<4;i++){
                int x2 = x1 + x[i];
                int y2 = y1 + y[i];
                if(x2>=0 && x2<n && y2>=0 && y2<n && grid[x2][y2]==0){
                    grid[x2][y2] = 1;
                    q.add(new int[]{x2,y2,distance1+1});
                }
            }
        }
        return distance;

    }
}

为什么要用陆地找海洋呢?海洋找陆地行不行呢?好像也行,以后试一试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值