42. 接雨水
我的解法是单调栈+前缀和,每次判断
class Solution {
public int trap(int[] height) {
int f[] = new int[height.length];
LinkedList<Integer> s = new LinkedList();
int pref[] = new int[height.length+1];//f的前缀和,【长度】=i的和
int preh[] = new int[height.length+1];//height的前缀和,【长度】=i的和
int result = 0;
for(int i = 0;i<height.length;i++){
int mi = 0;
while(!s.isEmpty()&&height[s.peek()]<=height[i]){
mi = s.pop();
}
if(s.isEmpty()&&height[mi]*(i-mi-1)>0){//i更高,i>mi+1
f[i] = height[mi]*(i-mi-1)-(pref[i]-pref[mi+1]+preh[i]-preh[mi+1]);
}
else if(!s.isEmpty()){//还有更高的
f[i] = height[i]*(i-s.peek()-1)-(pref[i]-pref[s.peek()+1]+preh[i]-preh[s.peek()+1]);
}
else{
f[i] = 0;
}
pref[i+1]=pref[i]+f[i];
preh[i+1]=preh[i]+height[i];
result += f[i];
s.push(i);
}
return result;
}
}
官方题解
感觉我的比较像第二个。但还是有很多不同。
它的每次计算相当于计算一个以top为角落的矩形size。