求能接到雨水的体积
使用递增栈和相减法来解决问题。
可以接的雨水的体积就是红色方框的减去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
逐层统计法
我们按照自底向上每一层进行统计,没统计完一层就将每根柱子的高度减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