class Solution {
public:
int trap(vector<int>& a) {
if(a.size()<=1) return 0;
int n=a.size(),mx[n],sum[n];
int val=a[n-1],dex=n-1;
for(int i=0;i<n;++i) sum[i]=i?(sum[i-1]+a[i]):a[i];
for(int i=n-2;i>=0;--i){//mx[i]:(i,n-1]最大值的下表
mx[i]=dex;
if(a[i]>val) val=a[i],dex=i;
}
int ans=0;
for(int i=0,j;i<n-1;i=j){
if(a[mx[i]]<a[i]){//后面的数全都小于h[i]
j=mx[i];
}else{
j=i+1;
while(j<n&&a[j]<a[i]) ++j;
}
//a.size()==1已被特判 不存在i=j的情况
ans+=(j-i-1)*min(a[i],a[j])-(sum[j-1]-sum[i]);
}
return ans;
}
};
leetcode 42. 接雨水 找到后面第一个大于他的找不到就找后面最大的 扫一遍就行。。
最新推荐文章于 2024-06-04 15:33:32 发布