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 trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        left = 0
        right = len(height) - 1
        left_max = right_max = area = 0

        while left < right:
            if height[left] < height[right]:
                if height[left] < left_max:
                    area += left_max - height[left]
                else:
                    left_max = height[left]
                left += 1
            else:
                if height[right] < right_max:
                    area += right_max - height[right]
                else:
                    right_max = height[right]
                right -= 1

        return area

分析:

代码用到了双指针的方法,该方法假设给定的height列表中间全是黑箱,每次只露出height的头部和尾部。

当头部遇到比它小的值时,它们的差值就是当前位置可以填充的雨水的数量;而当头部遇到比它大的值时,是无法填充雨水的,此时头部要更新,将这个更大的值作为新的头部,与后面的数字进行比较。

对尾部的处理用的也是同样的方法。

原文地址:https://www.cnblogs.com/tbgatgb/p/11163634.html

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

11-1:(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])

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

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 ] No.42 接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解题思路: 首先构建两个栈,h存高度,idx存下标. 遍历数组,将height[i]与h.top()做比较 若height[i] <= h.top(),则将对应的高度和下标都入栈. 若height[i] > h.top(),则表明可能可以求得面积. 实际上,对于index = k的方块而言,可能接住的雨水等于

11 Container With Most Water 42.Trapping Rain Water

11 和 42 本质上都是木桶原理: 11 如何才能存最多的水? 假设 a[left] < a[right] ,    total = a[left] *(right-left) ,  那么 right -1, right-2 位置 都比 total 小, 此时就没必要move right 了, 因为所有的right -x 都比 right 小. 此时只需要move left 指针, 继续找最大value. code 很简单: public int maxArea(int[] height) {

docker深入2-熟悉v1.11和找不同

2016/5/24 一.基础环境 1.系统版本 [[email protected] ~]# cat /etc/redhat-release  CentOS Linux release 7.1.1503 (Core)  [[email protected] ~]# uname -a                 Linux n36 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/

Oracle database 11.2.0.3.0 升级至 11.2.0.3.14

下载PSU p20299017_112030_Linux-x86-64(DATABASE PATCH SET UPDATE 11.2.0.3.14 (INCLUDES CPUAPR2015)).zip 及Opatch p6880880_112000_Linux-x86-64(OPatch patch of version 11.2.0.3.10 for Oracle software releases 11..zip 下载地址 http://yunpan.cn/cHACmBerMb526 访问密

Leetcode42. 接雨水

42. 接雨水 做法 考虑单独一列能生产多少贡献:用左右最大值去接这列的水 \(O(n)\) Code class Solution { public: int mx[1000000],rx[1000000]; int trap(vector<int>& height) { int n(height.size()); // int mx(0); for(int i=0;i<n;++i){ if(i==0) mx[i]=height[i]; else mx[i]=max(mx[i-

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表