標籤:leetcode 演算法
問題描述:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.Thanks Marcos for contributing this image!
基本思路:
本題通過分析可以發現,儲存水的槽的兩邊都是槽高的極大值。(這裡對於最左邊的曹,只要大於等於它右面的即可。最右邊的同理)
但是單純的考量 每兩個極大值的槽作為水槽的兩邊得到的結果是不對的。舉個例子:
A = {9,2, 9, 2,2,1,8}
這裡如果只考慮每兩個極大值之間存放的水,結果是7+0+1 = 8. 而實際上最大的結果應該是7+6+6+7 = 26.
所以,以沒有計算過的最左的槽為左槽,找到符合以下條件之一的槽為右槽:
- 該槽的槽高>= 最左的槽高
- 該槽是最左槽右側槽中槽高最大的。
(PS:此題我寫了好久。。。 總是有地方出錯。 後來發現是局部極大值和局部極大值的位置搞錯了-.-|| )
代碼:
int trap(int A[], int n) { //C++ if(n < 3) return 0; vector<int> locmaxs; int sum = 0; int i = 0; while(i < n) { if(i == 0 && A[0] >= A[1]) { locmaxs.push_back(0); i++; } else if(i == n-1 && A[n-1] >= A[n-2]) { locmaxs.push_back(n-1); i++; } else if(A[i] >= A[i-1] && A[i] >= A[i+1]) { locmaxs.push_back(i); i++; } else i++; } for(i = 0; i < locmaxs.size()-1; ) { int pos = i+1 ,max = locmaxs[i+1]; for( int j = i+1; j < locmaxs.size(); j++) { if(A[locmaxs[j]] >= A[locmaxs[i]]) { pos = j; break; } if(A[locmaxs[j]] > A[max]) { max = locmaxs[j]; pos = j; } } int draw = ((A[locmaxs[i]] > A[locmaxs[pos]]) ? A[locmaxs[pos]]: A[locmaxs[i]]); for(int j = locmaxs[i]+1; j < locmaxs[pos]; j++) if(draw - A[j] >0) sum += draw - A[j]; i = pos; } return sum; }
[leetcode]Trapping Rain Water