题目链接:https://leetcode.com/problems/trapping-rain-water/description/
思路:
1、先找到最左侧第一个高度不为0的柱子i。
2、从i+1开始向右侧找另一个柱子max。条件:要么a[max] > a[i],要么a[max] > 右侧所有。
1) 向右侧遍历,当遇到第一个比a[i]高的柱子,相当于遇到一座山,这个柱子会把左右两侧的池子给隔开。
所以,如果遇到第一个比a[i]高的柱子,就停下来。这时候就产生了一个和右侧隔开的池子。
2) 如果找到最后,一直没有遇到比a[i]还高的,那就取右侧最高的那个作为max。
a[max] 和 a[i]组成一个和右侧隔开的池子。
池子的面积就是 min(a[max] , a[i]) * (max - i - 1) - sum(a[i+1]...a[max-1])
3、把i定位到max,重复上述过程。以max为起点,找下一个池子。
show me the code:
class Solution { public: int trap(vector<int>& height) { vector<int> &a = height; int i,n = a.size(); int sum = 0; for(i = 0 ;i < n - 1; ) { while(i < n -1 && a[i] == 0) ++i; int max = i + 1; //i右侧最大值的下标 for(int j = i+1; j < n; j++) { if(a[j] > a[max]) max = j; if(a[max] > a[i]) break; } sum += min(a[i],a[max])*(max - i - 1); for(int j = i+1; j< max; j++) sum -= a[j]; i = max; } return sum; } };