[ Leetcode ] No.42 接雨水

题目:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

解题思路:

  • 首先构建两个栈,h存高度,idx存下标。
  • 遍历数组,将height[i]h.top()做比较
    1. height[i] <= h.top(),则将对应的高度和下标都入栈。
    2. height[i] > h.top(),则表明可能可以求得面积。

      实际上,对于index = k的方块而言,可能接住的雨水等于 min(left, right) * width

      left 表示左边第一个比它高的柱子高度,right表示右边第一个比它高的柱子高度。

      width表示宽度。

    3. 之所以是可能可求得面积,是因为可求面积的重要条件是,左右两边都有柱子。

      而恰如题目给出的例子中,[1, 2]这样的情况下,index = 1的那个柱子是没办法接雨水的。

      因为没左边的柱子。这样的情况需要特殊判断。

  • 在求面积的时候,要一直退栈退到栈顶元素比height[i]大或者相等
class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> h, idx;
        int sum = 0, tag = 0;
        int len = height.size();
        for(int i = 0; i < len; i++) {
            // 遍历到比栈尾还小的元素时,推入栈中
            if(h.empty() || h.top() >= height[i]) {
                h.push(height[i]);
                tag = 0;
                idx.push(i);
                continue;
            }
            while(h.top() < height[i]) {
                int temp = h.top();
                h.pop(), idx.pop();
                if(!h.empty()) {
                    int left = h.top(), left_h = idx.top();
                    sum += (min(height[i], left) - temp) * (i - left_h - 1);
                } else {
                    h.push(height[i]);
                    idx.push(i);
                    tag = 1;
                }
            }
            // 栈顶只可能比当前height[i]更大或相等
            while(!h.empty() && tag == 0) {
                if(h.top() == height[i]) {
                     h.pop(), idx.pop();
                     if(h.empty()) {
                        h.push(height[i]);
                        idx.push(i);
                        break;
                     }
                } else {
                    h.push(height[i]);
                    idx.push(i);
                    break;
                }
            }
        }
        return sum;
    }
};



心得:

虽然今天心情烦躁,但是鉴于抓住了一点思路,就打算自己写写这题。

因为之前看了不少关于单调队列、滑动窗口类型的题,感觉它们有点异曲同工的味道,很想尝试。

接近三个小时都在接雨水,提交了4次,最后AC打败了94%,美滋滋。

写着写着就没啥思路了,画图倒是一把好手!

继续跪谢阎总带我算法入门,三四百没白交。

原文地址:https://www.cnblogs.com/recoverableTi/p/12631619.html

时间: 2024-10-16 10:58:21

[ Leetcode ] No.42 接雨水的相关文章

[leetcode] 42. 接雨水

42. 接雨水 思路:一块柱子能接水的量取决于它左右两边最高的柱子中较短的一个. class Solution { public int trap(int[] height) { int left[] = new int[height.length]; int right[] = new int[height.length]; int max = 0; for (int i = 0; i < height.length; i++) { max = Math.max(max, height[i])

11-1:(42)接雨水

42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 An understandable python solution: class Solution(object): def tr

[Leetcode][Python]42: Trapping Rain Water

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 42: Trapping Rain Waterhttps://oj.leetcode.com/problems/trapping-rain-water/ Given n non-negative integers representing an elevation map where the width of each bar is 1,compute how much water

42. 接雨水

https://leetcode-cn.com/problems/trapping-rain-water/ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水). 感谢 Marcos 贡献此图. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6 来源:力扣(LeetCode)链接:ht

【一天一道LeetCode】#42. Trapping Rain Water

一天一道LeetCode系列 (一)题目 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much >water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation m

leetcode problem 42 -- Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation map is represented by a

LeetCode第[42]题(Java):Trapping Rain Water

题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In

leetcode python 042收集雨水

'''给定n个非负整数表示每个条的宽度为1的高程图,计算下雨后能够捕获多少水.例如,鉴于[0,1,0,2,1,0,1,3,2,1,2,1],返回6.这个题要先算出盛满水后的高程图,减去前者就是雨水.盛水多高取决于左右最高的两处低的一方.'''l1=[0,1,0,2,1,0,1,3,2,1,2,1]w=[]for i in range(len(l1)):    w.append(min(max(l1[0:i+1]),max(l1[i:]))-l1[i])print('收集雨水:',sum(w))

42.接雨水 Trapping Rain Water

本人的解法: public class Main { public int trap(int[] height) { // 统计雨水总数//temp登记最大值 int sum = 0; if (height.length != 0) { int temp = height[0]; int temp2 = 0; int temp3 = height[0]; int temp4 = height[height.length - 1]; //跟踪最大值的位置 for (int x = 0; x < h