题目链接:trapping-rain-water
import java.util.Stack; /** * 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! * */ public class TrappingRainWater { //解法一 // 315 / 315 test cases passed. // Status: Accepted // Runtime: 248 ms // Submitted: 0 minutes ago //时间复杂度O(n), 空间复杂度O(1) public int trap(int[] A) { int sum = 0; // int max = 0; for (int i = 0; i < A.length; i++) { //找到最大值 if(A[i] > A[max]) { max = i; } } //计算左边 int topest = 0; for (int i = 0; i < max; i++) { if(A[i] > topest) { topest = A[i]; } else { sum += topest - A[i]; } } //计算右边 topest = 0; for (int i = A.length - 1; i > max; i--) { if(A[i] > topest) { topest = A[i]; } else { sum += topest - A[i]; } } return sum; } //解法二 // 315 / 315 test cases passed. // Status: Accepted // Runtime: 282 ms // Submitted: 1 minute ago //时间复杂度O(n) 空间复杂度O(n) public int trap1(int[] A) { Stack<Integer> stack = new Stack<Integer>(); int sum = 0; int i = 0; int max = 0; //栈中的最大值 for (; i < A.length - 1; i++) { //找到最左边的最大值 if (A[i] > A[i + 1]) { stack.add(A[i]); max = A[i]; break; } } for (i = i + 1; i < A.length; i++) { int count = 1; while (!stack.isEmpty() && stack.peek() <= A[i]) { //如果栈顶元素小于当前元素 if(A[i] >= max) {//如果当前元素大于或等于栈中的最大值 while(!stack.isEmpty()) { //将栈中的元素全部出栈 sum += max - stack.pop(); } max = A[i]; //设置当前栈的最大值 } else { //如果当前元素小于栈中的最大值 sum += A[i] - stack.pop(); count++; //累计A[i]要进栈的次数 } } while(count != 0) { stack.add(A[i]); count --; } } return sum; } public static void main(String[] args) { } }
[LeetCode 42] Trapping Rain Water
原文:http://blog.csdn.net/ever223/article/details/44681121