778. Swim in Rising Water

题目传送门

思路分析

这里我使用了最简单的广度优先遍历方法去解决问题,与一般问题不同的是我们需要维护一个waterElevation表示当前的水面高度。如果我们所有的已搜索的方块高度均高于水平面,我们只有将水平面升高才能接着进行下一步的广度搜索。
这一步就是用于拉高水平面的。

	if(minHeap.front()[0] > waterElevation){
    	waterElevation = minHeap.front()[0];
        continue;
    }

为了每一步都能快速获取到最低的那个方块,我们可以使用小顶堆来动态地对其进行排序。

完整代码
class Solution {
public:
    static bool compare(vector<int> &a, vector<int> &b){
        return a[0] > b[0];
    }
    int swimInWater(vector<vector<int>>& grid) {
        int waterElevation = 0;
        vector<vector<int>> minHeap, dire{{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
        minHeap.push_back({grid[0][0], 0, 0});
        grid[0][0] = -1;
        while(true){
            if(minHeap.front()[0] > waterElevation){
                waterElevation = minHeap.front()[0];
                continue;
            }
            
            // arrive right-bottom
            int x{minHeap.front()[1]}, y{minHeap.front()[2]};
            if(x == grid.size() - 1 && y == grid[0].size() - 1)
                break;

            // pop heap top
            // push 4-derection square
            pop_heap(minHeap.begin(), minHeap.end(), compare);
            minHeap.pop_back();
            for( auto& dir : dire ){
                int nx{x + dir[0]}, ny{y + dir[1]};
                if( nx < 0 || 
                    nx >= grid.size() || 
                    ny < 0 || 
                    ny >= grid[0].size() || 
                    grid[nx][ny] == -1)
                    continue;
                minHeap.push_back({grid[nx][ny], nx, ny});
                push_heap(minHeap.begin(), minHeap.end(), compare);
                grid[nx][ny] = -1;
            }
        }
        return waterElevation;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值