zoukankan      html  css  js  c++  java
  • 407. Trapping Rain Water II

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining.

    Note:

    Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000.

    Example:

    Given the following 3x6 height map:
    [
      [1,4,3,1,3,2],
      [3,2,1,3,2,4],
      [2,3,3,2,3,1]
    ]
    
    Return 4.
    

    The above image represents the elevation map [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] before the rain.

    After the rain, water is trapped between the blocks. The total volume of water trapped is 4.

    Approach #1: C++. [priority_queue]

    class Solution {
    public:
        int trapRainWater(vector<vector<int>>& heightMap) {
            if (heightMap.size() == 0) return 0;
            int row = heightMap.size(), col = heightMap[0].size();
            vector<vector<int>> visited(row, vector<int>(col, 0));
            priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
            
            for (int i = 0; i < col; ++i) {
                pq.push({heightMap[0][i], {0, i}});
                pq.push({heightMap[row-1][i], {row-1, i}});
                visited[0][i] = 1;
                visited[row-1][i] = 1;
            }
            
            for (int i = 1; i < row-1; ++i) {
                pq.push({heightMap[i][0], {i, 0}});
                pq.push({heightMap[i][col-1], {i, col-1}});
                visited[i][0] = 1;
                visited[i][col-1] = 1;
            }
            
            int ans = 0;
            int curMaxHeight = 0;
            
            while (!pq.empty()) {
                pair<int, pair<int, int>> cur = pq.top();
                pq.pop();
                curMaxHeight = max(curMaxHeight, cur.first);
                int x = cur.second.first, y = cur.second.second;
                for (auto dir : dirs) {
                    int xx = x + dir.first;
                    int yy = y + dir.second;
                    if (judge(xx, yy, heightMap) && visited[xx][yy] == 0) {
                        pq.push({heightMap[xx][yy], {xx, yy}});
                        visited[xx][yy] = 1;
                        if (heightMap[xx][yy] < curMaxHeight) {
                            ans += curMaxHeight - heightMap[xx][yy];
                        }
                    }
                }
            }
            
            return ans;
        }
        
    private:
        vector<pair<int, int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
        static bool judge(int x, int y, vector<vector<int>>& heightMap) {
            int m = heightMap.size();
            int n = heightMap[0].size();
            if (x < 0 || x >= m || y < 0 || y >= n) return false;
            else return true;
        }
    };
    

      

    Analysis:

    The problem is very typical of this similar questions.

    Firstly, we use a priority_queue to store the bordars cells.

    Secondly, we access to the top-first elements and record the maximum height in the top-first elements from start to now.

    Thirdly, traveling current top-first element's top, left, right and bottom cells, if the position if vaild and the cell's height is less then the maximum height, then we use maximum height to subtract the cell's value, and add the difference to the ans.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    智能算法:遗传算法
    matlab中画一条折线时怎样显示出每个点折点的数值
    灰色系统模型
    图论中TSP问题的LINGO求解与应用
    图论中最短路算法与程序实现
    图论中最优树问题的LINGO求解
    Hexo博客NexT主题美化之评论系统
    IN612L支持2.4G及蓝牙5.0全协议的SoC芯片替换NRF52832/NRF52840
    超低功耗蓝牙5.0芯片PHY6202替代NRF51822/NRF51802/NRF52832
    NRF51802多协议低功耗蓝牙/2.4G系统级芯片对比NRF51822差异
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10151233.html
Copyright © 2011-2022 走看看