Leetcode: Trapping Rain Water

题目

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!

 

思路:

1. 以前在 leetcode 上做过一道题叫做 candy, 这道题类似, 那道题的精髓在于从左到右和从右到左两遍扫描

2. 使用堆栈记录一个槽的左右 index, 然后统计其可存放的雨水

3. (2) 的方法不能统计高度递减的槽, 因此还需要一次从右向左的扫描

4. 代码中的 queue 和 stack 都是一种东西, 名字不同而已

 

代码:

class Solution {
public:
    int trap(int A[], int n) {
		if(n <=2)
			return 0;

		deque<int> queue;
		int sum = 0;
		for(int i = 0; i < n; i ++) {
			if(queue.empty() || A[i] <queue[0]) {
				queue.push_back(A[i]);
			}else{ // 容器的另一半
				while(!queue.empty()) {
					sum += queue[0]-queue.back();
					queue.pop_back();
				}
				queue.push_back(A[i]);
			}
		}
		// reverse last part
		deque<int> stack;

		for(int i = queue.size()-1; i >= 0; i-- ) {
			if(stack.empty() || queue[i] < stack[0]) {
				stack.push_back(queue[i]);
			}else{
				while(!stack.empty()) {
					sum += stack[0]-stack.back();
					stack.pop_back();
				}
				stack.push_back(queue[i]);
			}
		}
		return sum;
    }
};

  

posted @ 2014-01-08 13:59  SangS  阅读(714)  评论(0编辑  收藏  举报