求能接到雨水的体积
方法1
使用递增栈和相减法来解决问题。
可以接的雨水的体积就是红色方框的减去1-5部分的体积。我们先从左往右和从右往左找到第一个最高的柱子,分别用一个递增栈来保存,然后就可以轻松的画出1-5这五个需要减掉的部分。时间复杂度为O(n)
class Solution:
def trap(self, height):
if height == [] or height == None:
return 0
maxheight = max(height)
left ,right = 0, 0
for i in range(len(height)):
if height[i] == maxheight:
left = i
break
for i in range(len(height)-1, -1, -1):
if height[i] == maxheight:
right = i
break
stack_left2right = []
for i in range(left+1):
if len(stack_left2right) == 0:
stack_left2right.append(i)
else:
if height[i] > height[stack_left2right[-1]]:
stack_left2right.append(i)
stack_right2left = []
for i in range(len(height)-1, right-1, -1):
if len(stack_right2left) == 0:
stack_right2left.append(i)
else:
if height[i] > height[stack_right2left[-1]]:
stack_right2left.append(i)
minus = 0
for i in range(1,len(stack_left2right)):
minus += (height[stack_left2right[i]] - height[stack_left2right[i-1]]) * (stack_left2right[i] - 0)
stack_right2left = stack_right2left[::-1]
for i in range(len(stack_right2left)-2,-1,-1):
minus += (height[stack_right2left[i+1]] - height[stack_right2left[i]] )* (stack_right2left[i] - len(height)+1)
res = 0
for i in height:
res += maxheight - i
res -= minus
return res
方法2
逐层统计法
我们按照自底向上每一层进行统计,没统计完一层就将每根柱子的高度减1,直到所有柱子的高度都小于等于0结束。
第一层:
第二层:
第三层:
时间复杂度为O(n*maxheight)
超时代码(314/315)
class Solution:
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if height == [] :
return 0
length = len(height)
maxheight = max(height)
result= 0
for i in range(0,maxheight):
left = 0
right=length-1
while(height[left]<=0 and left<length):
left+=1
while(height[right]<=0 and right>-1):
right-=1
for j in range(left,right+1):
if height[j]<=0:result+=1
else:height[j]-=1
return result