题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
出处
思路
就是寻找“凹”形区间,找使得左右两端点为最大的两个值的最长区间。这里我分了两种情况,右边大于等于左边和右边小于左边,分别是在if和else if中。
代码
class Solution {
public:int trap(vector<int>& height) {int n=height.size();if(n==1)return 0;int left=0,right;int sum=0;int maxl,maxr,rindex;while(left<n-1) {right=left+1;if(height[right]>height[left]){left++;continue;//此时left不是合法左边}maxl=height[left];maxr=height[right];rindex=0;while (right<n&&height[right]<height[left]){if(height[right]>maxr){maxr=height[right];rindex=right;}right++;}if(right-left>1&&right<n){//右边大于等于左边int t=height[left];for(int i=left+1; i<right; i++)sum+=(t-height[i]);left=right;}else if(rindex!=0){//右边小于左边int t=height[rindex];for(int i=left+1; i<rindex; i++)sum+=(t-height[i]);left=rindex;}elseleft++;}return sum;}
};