1. 原始题目

给定 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

2. 思路

最简单的想法:对于每个元素都要考虑它能接多少雨水:

第一个元素是0,能接0雨水

第二个元素是1,能接0雨水

第三个元素是0,能接1雨水

...

第六个元素是0,能接2雨水。

可以看到,每个元素能接的雨水量是:当前位置左边最高的数与右边最高的数的最小值减去当前位置的数

例如第六个元素接水量为2 = min(2,3)-0=2。

总结:对于每个位置,都考虑其左边最高的墙和右边最高的墙即可。

3. 解题

思路图:

 class Solution:
def trap(self, height):
if not height: return 0
n = len(height)
left,right = [0]*n, [0]*n # 每个位置都存放其左边最大值和右边最大值
temp = 0
for i in range(n):
temp= max(temp,height[i]) # 找每个元素的左边最大值(含自身)
left[i] = temp
temp = 0
for i in range(n-1,-1,-1):
temp = max(temp,height[i]) # 找每个元素的右边最大值(含自身)
right[i] = temp
res = 0
for i in range(n):
res+=min(left[i],right[i])-height[i] # 最小的高度值-自身
return res

方法2. 双指针法

还是一个思路:当前位置需要左右两堵墙的最小值减去当前值。

左右两端各设定一个指针,初始两堵墙。如果左端小于右端,则以右端为墙,当前值等于左墙和右墙的最小值减去当前值。

 class Solution:
def trap(self, height):
if not height: return 0 left, right = 0 , len(height)-1 # 左右指针
area = 0
leftwall, rightwall = 0,0 # 左墙和右墙
while(left<right):
if height[left]<height[right]: # 右边高,则以右端为墙
if leftwall>height[left]: # 如果左墙也比当前位置高的话
area+=min(leftwall,height[right])-height[left] # 面积就是两墙最低者减去当前位置的高度
else:
leftwall = height[left] # 否则更新左墙
left+=1
else:
if rightwall>height[right]:
area+=min(rightwall,height[left])-height[right]
else:
rightwall = height[right]
right-=1
return area

*42. Trapping Rain Water 接雨水的更多相关文章

  1. [LeetCode] 42. Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  2. 【LeetCode】42. Trapping Rain Water 接雨水 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 保存左右最大值 单调栈 日期 题目地址:ht ...

  3. 刷题42. Trapping Rain Water

    一.题目说明 题目是42. Trapping Rain Water,翻译起来就是"接雨水".给n个非负正数代表高度,每个正数宽度为1,让计算能多少雨水.题目难度是Hard 二.我的 ...

  4. LeetCode - 42. Trapping Rain Water

    42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...

  5. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

  6. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...

  7. [array] leetcode - 42. Trapping Rain Water - Hard

    leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...

  8. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))

    LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...

  9. leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II

    11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...

随机推荐

  1. WEB工具类

    import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; ...

  2. Hbuilder工具使用

    现在用的版本是:HBuilder 9.1.19.201808300739 前段时间自动更新了下,也忘记了是更新后js代码不能正常代码提示,还是又发生了什么事情,导致了不能正常提示,也没时间去排查,卸载 ...

  3. 【翻译】asp.net core2.0中的token认证

    原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...

  4. [Cordova 之 入门篇]

    1. cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 2. 为什么用cordova 基于 ...

  5. iOS企业开发者账号实现内部分发

    前言 上个月由于公司开发的棋牌类游戏接近尾声,需要大量的苹果测试机来支持,之前只有一个公司开发者账号,每添加新的测试机都需要添加一次UDID,做了不少无用功,再加上本身外包性质的公司导致客户方面频繁更 ...

  6. Consecutive Sum LightOJ - 1269(区间异或和)

    Consecutive Sum 又来水一发blog... 本来是昨天补codechef的题,最后一道题是可持久化字典树,然后去黄学长博客看了看 觉得字典树写法有点不太一样,就想着用黄学长的板子写码几道 ...

  7. 使用 PHP SOAP 来创建一个简单的 Web Service。

    访问: http://www.debug.com/php-soap-demo.php?client=22 结果: apache: <VirtualHost _default_:80> Do ...

  8. word 2013 标题设置多级列表

    1.问题 要设置标题为多级列表,批量应用 2.解决 1选标题1 2选标题2 ...以此类推.点确定保存即可

  9. Python基础学习笔记4-28(持续更新)

    Python学习笔记 第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信.需要操作系统进行协调 ...

  10. Logstash处理json格式日志文件的三种方法

    假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JS ...