题目要求:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路1:
历遍列表
找到第一个凹索引以其为中心向两边双指针扩散
不满足单调性则停止扩散 记录当前区域面积
将索引跳至当前区域的下一位 重复寻找
存在问题:
有一种情况没有考虑到 即一块连续区域内包含多个凹位置
如输入[5,2,1,2,1,5]
存在两个凹位置 该思路输出结果为1 实际输出应为14
class Solution:
def trap(self, height:list) :
i = 1
lens = len(height)
wid = 0
sum = 0
while(i<lens-1):
if i >0:
if height[i] <height[i-1] and height[i]<height[i+1] :#找到凹位置
L,R = i,i
while(L>0 and height[L] <height[L-1]):
L-=1
while(R<lens-1 and height[R]<height[R+1]):
R+=1
wid = min(height[L],height[R])
for i in range(L,R+1):
if height[i]<wid:
sum+=wid - height[i]
i = R+1
if i >lens -1:
break
else:
i+=1
return sum
思路2:
找出整个列表的最大值
从左向最大值历遍
如果当前高度小于当前高度左边的最大值 则该列可以装下max-height[i]的水
再从右向最大值历遍
重复上述过程
即可得出结论
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if len(height) <= 1:
return 0
max_height = 0
max_height_index = 0
# 找到最高点
for i in range(len(height)):
h = height[i]
if h > max_height:
max_height = h
max_height_index = i
area = 0
# 从左边往最高点遍历
tmp = height[0]
for i in range(max_height_index):
if height[i] > tmp:
tmp = height[i]
else:
area = area + (tmp - height[i])
# 从右边往最高点遍历
tmp = height[-1]
for i in reversed(range(max_height_index + 1, len(height))):
if height[i] > tmp:
tmp = height[i]
else:
area = area + (tmp - height[i])
return area