class Solution:
def calLeft(self,height,rightval,left,right):
if left>=right:
return 0
sums = 0
maxindex=0
maxval=-1
for i in range(left,right):
cur = height[i]
if cur>maxval:
maxval=cur
maxindex=i
waterlevel = min(maxval,rightval)
for i in range(maxindex+1,right):
sums += max(0,waterlevel-height[i])
sums += self.calLeft(height,waterlevel,0,maxindex)
return sums
def calRight(self,height,leftval,left,right):
if left>=right:
return 0
sums = 0
maxindex = 0
maxval = -1
for i in range(right,left,-1):
cur = height[i]
if cur>maxval:
maxval=cur
maxindex = i
waterlevel = min(maxval,leftval)
for i in range(left+1,maxindex):
sums += max(0,waterlevel-height[i])
sums +=self.calRight(height,waterlevel,maxindex,len(height)-1)
return sums def trap(self, height: 'List[int]') -> int:
maxindex = 0
maxval = -1
sums = 0
for i in range(len(height)):
curval = height[i]
if curval > maxval:
maxval = curval
maxindex = i
sums += self.calLeft(height,maxval,0,maxindex)
sums += self.calRight(height,maxval,maxindex,len(height)-1)
return sums

这道题的主要思想是搜索,先找到最大的值maxval,对应的索引maxindex,然后向左右两个方向分别搜索。记height的长度为length。

左侧的部分[0,maxindex),从小到大寻找当前区间的最大值leftmaxval,对应的索引leftmaxindex,然后从计算(leftmax,maxindex)之间的区域。

用递归的方式,继续计算[0,leftmaxindex),一直到这个区间长度为0,不再进行递归。

同理,右侧部分(maxindex,length],从大到小寻找最大值rightmaxval,对应的索引rightmaxindex,然后计算(midindex,rightmaxindex)之间的区域。

用递归的方式,继续计算(rightmaxindex,length],一直到这个区间的长度为0,不再进行递归。

在主函数中,找到全局的(第一个出现的,也可以是任意一个)最大值,然后分别调用左右两侧的递归方法。

这里有个小技巧(贪心思想),就是左侧区间找最靠左的最大值,右侧区找最靠右的最大值。这样能尽可能扩大每次搜索所确定的区域,使得在每次搜索到多个相等的最大值时,可以减少递归次数。

本题还有其他的解决方案,使用非递归的方式效率更高。

leetcode42的更多相关文章

  1. LeetCode42 Trapping Rain Water

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

  2. [Swift]LeetCode42. 接雨水 | Trapping Rain Water

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

  3. Leetcode42. 接雨水

    42. 接雨水 做法 考虑单独一列能生产多少贡献:用左右最大值去接这列的水 \(O(n)\) Code class Solution { public: int mx[1000000],rx[1000 ...

  4. LeetCode42题,单调栈、构造法、two pointers,这道Hard题的解法这么多?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第23篇文章. 今天来看一道很有意思的题,它的难度是Hard,并且有许多种解法. 首先我们来看题面,说是我们有若 ...

  5. LeetCode---42. 接雨水 (hard)

    题目:42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例: 输入:height = [0,1,0,2,1,0,1,3,2,1,2, ...

  6. LeetCode42. 接雨水(java)

    42.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种 ...

  7. 2018Java开发面经(持续更新)

    不要给自己挖坑!!!不要给自己挖坑!!!不要给自己挖坑!!!如果面试官只是问你了解xxx吗,如果不是很了解,就直接说不知道,不要说知道,不然面试官深问再不知道就印象很不好! 处女面送给了头条(北京)日 ...

  8. 2018java开发一些面经

    算法系列:https://www.cnblogs.com/yanmk/p/9232908.html 2018Java开发面经(持续更新) 不要给自己挖坑!!!不要给自己挖坑!!!不要给自己挖坑!!!如 ...

  9. 单调队列 && 单调栈

    单调队列 && 单调栈 单调队列 维护某个滑动区间的min or max,可用于dp的优化 以维护min为例,采用STL双端队列实现 每次加入元素x前 先检查队首元素==滑动后要删除的 ...

随机推荐

  1. Windows+Linux双系统所导致的时间不一致问题的原因及解决方案

    参考自:https://www.cnblogs.com/x_wukong/p/4401499.html 前几天在自己的windows10另外还装了一个Ubuntu,使用后发现windows时间一直不对 ...

  2. php英语单词大全95

    abstract抽象的 -挨伯丝拽克特 access存取.访问 -挨克色丝 account账户 -厄靠恩特 action动作 -爱克身 activate激活 -爱克特维特 active活动的 -爱克得 ...

  3. [LeetCode&Python] Problem 720. Longest Word in Dictionary

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  4. IDEA 类图功能使用方法

    1. Ctrl+Shift+Alt+U显示类图,(可以选中代码中类,再按快捷键,直接进入此类的类图) 2. 在类图中,选中某类右击显示Show Implementations,弹出子类的选择框. 按S ...

  5. CodeForces - 660D:Number of Parallelograms (问N个点多少个平行四边形)

    pro:给定N个点,问多少个点组成了平行四边形.保证没有三点共线. sol:由于没有三点贡献,所以我们枚举对角线,对角线的中点重合的就是平行四边形.如果没说保证三点不共线就不能这么做,因为有可能4个点 ...

  6. js调用app启动页

    第一步:添加js $(function () { var ua = window.navigator.userAgent.toLowerCase(); //微信 if(ua.match(/MicroM ...

  7. pc端 添加购物车示例

    添加到购物车列表及相关商品推荐. <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. alpha冲刺(5/10)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 博客撰写 问题困扰: 我想尝试让他们自己安排明天的任务,不知道是否可行. 心得体会: 一 ...

  9. python装饰器的详细解析

    什么是装饰器? python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于 ...

  10. struct 和typedef struct

    1.typedef (1)typedef的使用 定义一种类型的别名,而不只是简单的宏替换(见陷阱一).用作同时声明指针型的多个对象 typedef char* PCHAR; // 一般用大写,为cha ...