1.問題描述
給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖,計(jì)算按此排列的柱子,下雨之后能接多少雨水。
高度圖
上面是由數(shù)組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個(gè)單位的雨水(藍(lán)色部分表示雨水)。
示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
2.方法
直觀想法
直接按問題描述進(jìn)行。對(duì)于數(shù)組中的每個(gè)元素,我們找出下雨后水能達(dá)到的最高位置,等于兩邊最大高度的較小值減去當(dāng)前高度的值。
3.執(zhí)行代碼
class Solution {
public int trap(int[] height) {
int ans=0;
for(int i=1;i<height.length-1;i++){
int left_max=0,right_max=0;
for(int j=i;j>=0;j--){
left_max=max(left_max,height[j]);//向左遍歷找最大值
}
for(int j=i;j<=height.length-1;j++){
right_max=max(right_max,height[j]);//向右遍歷找最大值
}
ans+=min(left_max,right_max)-height[i];//遍歷到當(dāng)前元素所接雨水總數(shù)
}
return ans;
}
private int max(int a, int b ) {
if(a>b) return a;
else return b;
}
private int min(int a, int b) {
if(a<b) return a;
else return b;
}
}
4.復(fù)雜度分析
時(shí)間復(fù)雜度: O(n2)。數(shù)組中的每個(gè)元素都需要向左向右掃描。
空間復(fù)雜度 O(1)的額外空間。