最近太忙了!!!抱歉各位粉丝,没有达到每日一更,但是我有在做题!!!
最近做了动态规划、滑动窗口、接雨水之类的题
来,废话不多说,上题。
接雨水
我们用3种做法循序渐近
最简单的暴力法(核心思想:算 i 处出能接的最多的水)
暴力法的改进(核心思想:左边和右边的 max 先算好保存下来)
双指针(核心思想:左右指针,谁小,我就算谁边上的那个)
来,上题。
题目:
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
好了,就别多种解法了,上最屌的解法三:双指针
代码如下:
class Solution:
def trap(self, height: List[int]) -> int:
if len(height)<=2: return 0
n = len(height)
l = 0
r = n-1
l_max = height[0]
r_max = height[-1]
water = 0
while l<=r:
if l_max < r_max:
if l_max-height[l] >= 0:
water += l_max-height[l]
else:
l_max = height[l]
l += 1
else:
if r_max-height[r] >= 0:
water += r_max-height[r]
else:
r_max = height[r]
r -= 1
return water
注意:
双指针(核心思想:左右指针,谁小,我就算谁边上的那个)
其实是四个指针。
两个指针,left,right在一直移动。
剩下两个是左右的max指针。left_max和right_max。
好了,就这样了。多回头看代码就好。