资讯专栏INFORMATION COLUMN

407. Trapping Rain Water II

wenzi / 1053人阅读

407. Trapping Rain Water II

题目链接:
https://leetcode.com/problems...

参考discussion里的解法:
https://discuss.leetcode.com/...

参考博客里的解释:
http://www.cnblogs.com/grandy...

public class Solution {
    public int trapRainWater(int[][] heightMap) {
        // base case
        if(heightMap.length == 0 || heightMap[0].length == 0) return 0;
        
        int m = heightMap.length, n = heightMap[0].length;
        // bfs, heap
        boolean[][] visited = new boolean[m][n];
        // add 4 sides first, since 4 side can not store water
        PriorityQueue minHeap = new PriorityQueue<>((m+n), (a, b) -> a.h - b.h);
        // 1st col and last col
        for(int i = 0; i < m; i++) {
            minHeap.offer(new Cell(i, 0, heightMap[i][0]));
            visited[i][0] = true;
            minHeap.offer(new Cell(i, n - 1, heightMap[i][n-1]));
            visited[i][n-1] = true;
        }
        // 1st row and last row
        for(int j = 0; j < n; j++) {
            minHeap.offer(new Cell(0, j, heightMap[0][j]));
            visited[0][j] = true;
            minHeap.offer(new Cell(m-1, j, heightMap[m-1][j]));
            visited[m-1][j] = true;
        }
        // bfs find water
        int res = 0;
        while(!minHeap.isEmpty()) {
            Cell cur = minHeap.poll();
            for(int[] dir : dirs) {
                int nx = cur.x + dir[0], ny = cur.y + dir[1];
                if(nx >= 0 && nx < m && ny >= 0 && ny < n && !visited[nx][ny]) {
                    visited[nx][ny] = true;
                    if(heightMap[nx][ny] < cur.h) res += cur.h - heightMap[nx][ny];
                    minHeap.offer(new Cell(nx, ny, Math.max(cur.h, heightMap[nx][ny])));
                }
            }
        }
        return res;
    }
    
    int[][] dirs = new int[][] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
}

class Cell {
    int x;
    int y;
    int h;
    Cell(int x, int y, int h) {
        this.x = x;
        this.y = y;
        this.h = h;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69855.html

相关文章

  • [Leetcode] Trapping Rain Water 积水问题

    摘要:从右向左遍历时,记录下上次右边的峰值,如果左边一直没有比这个峰值高的,就加上这些差值。难点在于,当两个指针遍历到相邻的峰时,我们要选取较小的那个峰值来计算差值。所以,我们在遍历左指针或者右指针之前,要先判断左右两个峰值的大小。 Trapping Rain Water Given n non-negative integers representing an elevation map ...

    caohaoyu 评论0 收藏0
  • Leetcode[42] Trapping Rain Water

    摘要:复杂度思路因为蓄水多少取决于比较短的那块板的长度。代码复杂度思路考虑说明时候需要计算蓄水量当的时候,需要计算能储存的水的多少。每次还需要取出一个作为中间值。如果则一直向里面压进去值,不需要直接计算。 Leetcode[42] Trapping Rain Water Given n non-negative integers representing an elevation map ...

    jonh_felix 评论0 收藏0
  • 42. Trapping Rain Water

    摘要:题目解答左边比右边小或者大都可以盛水,所以我们不能直接确定右边是否会有一个柱子比较大,能盛所有现在积攒的水。那么我们就找到中间最大的那个柱子,把它分成左右两边,那么不管从左边还是右边都能保证最后可以有最高的柱子在,之前盛的水都是有效的 题目:Given n non-negative integers representing an elevation map where the wid...

    seanlook 评论0 收藏0
  • [LintCode/LeetCode] Trapping Rain Water [栈和双指针]

    摘要:一种是利用去找同一层的两个边,不断累加寄存。双指针法的思想先找到左右两边的第一个峰值作为参照位,然后分别向后向前每一步增加该位与参照位在这一位的差值,加入,直到下一个峰值,再更新为新的参照位。 Problem Given n non-negative integers representing an elevation map where the width of each bar i...

    bluesky 评论0 收藏0
  • leetcode42 Trapping Rain Water

    摘要:我先通过堆栈的方法,找到一个封闭区间,该区间可以盛水,该区间的右节点可以作为下一个封闭区间的起点。思路三堆栈的聪明使用在这里,堆栈允许我们渐进的通过横向分割而非之前传统的纵向分割的方式来累加计算盛水量。 题目要求 Given n non-negative integers representing an elevation map where the width of each bar...

    GitCafe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<