11-03每日一题:Leetcode407. 接雨水 II

Leetcode407. 接雨水 II

思路:优先队列

维护边缘的最小堆,因为边缘格子不能接水,使用一个数组标记无法接水或者已经访问的格子,保证每个格子最多只需要遍历一次,每次从最小堆中找到最小的围墙,比它矮的其它未被访问的格子一定是可以接水的,更新一下答案,并将其高度入堆

时间复杂度: O ( M N l o g ( M N ) O(MNlog(MN) O(MNlog(MN),维护一个优先队列
空间复杂度: O ( M N ) O(MN) O(MN)维护一个标记的矩阵
typedef pair<int, int> PII;

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        priority_queue<PII, vector<PII>, greater<PII>> q;
        int n = heightMap.size(), m = heightMap[0].size();
        if (n < 2 || m < 2) return 0;
        vector<vector<bool>> visit(n, vector<bool>(m, false));
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ )
                if (i == 0 || i == n - 1 || j == 0 || j == m - 1)
                {
                    q.push({heightMap[i][j], i * m + j});
                    visit[i][j] = true;
                }
        
        int res = 0;
        int dr[5] = {-1, 0, 1, 0, -1};
        while (q.size()) {
            PII t = q.top();
            q.pop();
            for (int i = 0; i < 4; i ++ ) {
                int dx = t.second / m + dr[i];
                int dy = t.second % m + dr[i + 1];
                if (dx >= 0 && dx < n && dy >= 0 && dy < m && !visit[dx][dy]) {
                    if (heightMap[dx][dy] < t.first) {
                        res += t.first - heightMap[dx][dy];
                    }
                    visit[dx][dy] = true;
                    q.push({max(heightMap[dx][dy], t.first), dx * m + dy});
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shirandexiaowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值