Leetcode:42. Trapping Rain Water

Description

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.

Example

For example, 

Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

思路

  • 最开始用一个栈实现,16ms,思路有点复杂了
  • 栈里存的是小于当前最大值的元素。比如最开始是0,然后当前最大值是0,遇到1后出栈,然后1入栈,然后存0,然后遇到2,全部出栈,2入栈。。在这个过程中计算存水量
  • 思路2:借鉴11题的思路。

代码

  • 用栈实现
class Solution {
public:
    int trap(vector<int>& height) {
		int len = height.size();
		if (len <= 2) return 0;

		stack<int> Stack;
		int res = 0, i = 0, smax = height[0], index = 0;
		int sum = 0, tmp = 0, last = 0;

		while (i < len){
			if (Stack.empty() || height[i] < smax){
				Stack.push(i);
				i++;
				continue;
			}
			else{
				tmp = 0;
				sum = 0;
				while (!Stack.empty()){
					tmp = Stack.top();
					if (Stack.size() > 1)
						sum += height[tmp];

					Stack.pop();
				}
				smax = height[i];
				index = i - tmp - 1;
				res += min(height[i], height[tmp]) * index - sum;
			}
		}

		if (Stack.empty()) return res;

		last = Stack.top();
		Stack.pop();
		while (!Stack.empty()){
			if (height[last] <= height[Stack.top()]){
				last = Stack.top();
				Stack.pop();
			}
			else{
				tmp = -1;
				sum = 0;
				while (!Stack.empty() && height[Stack.top()] < height[last]){
					tmp = Stack.top();
					Stack.pop();
					sum += height[tmp];
					
				}
				if (Stack.empty()) break;

				
				tmp = Stack.top();
				Stack.pop();
				index = last - tmp - 1;
				res += min(height[last], height[tmp]) * index - sum;
				last = tmp;
				
			}
		}
		return res;
	}
};
  • 借鉴11题的思路,非常巧妙,找个例子顺着代码理一理就通了
class Solution {
public:
   int trap(vector<int>& height) {
		int len = height.size();
		int left = 0;
		int right = len - 1;
		int sum = 0;
		while (left < right)
		{
			int m = min(height[left], height[right]);
			if (height[left] == m)
			{
				while (++left < right && height[left] < m)
					sum += m - height[left];
			}
			else{
				while (left < --right && height[right] < m)
					sum += m - height[right];
			}
		}
		return sum;
	}
};
posted @ 2017-05-12 14:38  JeffLai  阅读(169)  评论(0编辑  收藏  举报