ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leedcode 407. 接雨水2

2022-07-12 23:35:34  阅读:163  来源: 互联网

标签:heightMap vis int fy leedcode 雨水 407 fx que


 

 

 

 

 

思路分析 :

在二维中的接雨水,对每一个位置可以接水的量是其左侧的最大值和右侧的最大值中取小值

而在三维的接雨水中,首先可以知道的是最外面一层是不能接水的,因此对内层某一个位置的可以接水量,即为其四周高度的最小值决定的

我们可以借助优先队列,上来先将四周放入其中,取四周中最小的那个拿出来更新其邻域,新更新的再重新作为边界。

代码示例:

class Solution {
public:
    struct node{
        int x, y;
        int h;

        node(int _x, int _y, int _h): x(_x), y(_y), h(_h){}
        bool operator< (const node &v) const{
            return h > v.h;
        }
    };
    int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};

    int trapRainWater(vector<vector<int>>& heightMap) {
        priority_queue<node> que;
        int m = heightMap.size();
        int n = heightMap[0].size();
        int vis[205][205];
        memset(vis, 0, sizeof(vis));

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if (i == 0 || i == m-1 || j == 0 || j == n-1) {
                    que.push({i, j, heightMap[i][j]});
                    vis[i][j] = 1;
                }
            }
        }

        int ans = 0;
        while(!que.empty()){
            node v = que.top();
            que.pop();

            for(int i = 0; i < 4; i++){
                int fx = v.x + dir[i][0];
                int fy = v.y + dir[i][1];

                if (fx >= 0 && fx < m && fy >= 0 && fy < n && !vis[fx][fy]){
                    if (heightMap[fx][fy] < v.h) {
                        ans += v.h - heightMap[fx][fy];
                        // heightMap[fx][fy] = v.h;
                    }
                    vis[fx][fy] = 1;
                    que.push({fx, fy, max(v.h, heightMap[fx][fy])});
                }
            }
        }

        return ans;
    }
};

  

 

标签:heightMap,vis,int,fy,leedcode,雨水,407,fx,que
来源: https://www.cnblogs.com/ccut-ry/p/16472186.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有