LeetCode 42. 接雨水 (從兩邊往中間搜尋)
阿新 • • 發佈:2018-11-14
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 Marcos 貢獻此圖。
示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1] 輸出: 6
方法一(執行超時):
思路:按層數統計 每層遍歷 O(n3)
class Solution { // 思路:按層數統計 每層遍歷 從第一個大於等於k的開始 從下一個大於等於k的結束 public int trap(int[] height) { // 判空 if(height.length==0) return 0; // 先取出陣列的最大值和最小值 int max=height[0]; int min=height[0]; for(int i=0;i<height.length;i++){ max=height[i]>max?height[i]:max; min=height[i]>min?min:height[i]; } int sum=0; for(int i=min+1;i<=max;i++){ int pre=-1; int next=-1; for(int index=0;index<height.length;index++){ if(height[index]>=i && pre==-1){ pre=index; next=pre; } if(height[index]>=i && pre!=-1){ next=index; } } for(int j=pre+1;j<next;j++){ if(height[j]<i){ height[j]+=1; sum+=1; } } } return sum; } }
方法二:
思路:木桶原理 乘多少水由最小值決定 從兩邊往中間搜尋(實質是向最大值靠近 分為左右兩邊分別統計) O(n)
class Solution { // 思路:木桶原理 乘多少水由最小值決定 從兩邊往中間搜尋(實質是向最大值靠近 分為左右兩邊分別統計) public int trap(int[] height) { // 判空 if(height.length==0) return 0; // 左右向中間搜尋 int left=0; int right=height.length-1; int sum=0; // 儲存區域性最大值 int secHeight=0; while(left<right){ if(height[left]<height[right]){ secHeight=secHeight>height[left]?secHeight:height[left]; sum+=secHeight-height[left]; left++; } else{ secHeight=secHeight>height[right]?secHeight:height[right]; sum+=secHeight-height[right]; right--; } } return sum; } }