题目:
https://leetcode-cn.com/problems/trapping-rain-water/
import java.util.Stack; public class _42_TrapWater { // 动态规划 public int trap1(int[] height) { if (height.length == 0) { return 0; } int[] leftMax = new int[height.length]; int[] rightMax = new int[height.length]; leftMax[0] = height[0]; rightMax[height.length - 1] = height[height.length - 1]; for (int i = 1, j = height.length - 2; i < height.length; i++, j--) { leftMax[i] = Math.max(leftMax[i - 1], height[i]); rightMax[j] = Math.max(rightMax[j + 1], height[j]); } int water = 0; for (int i = 0; i < height.length; i++) { water += Math.min(leftMax[i], rightMax[i]) - height[i]; } return water; } // 单调栈 public int trap2(int[] height) { int water = 0; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < height.length; i++) { while (!stack.isEmpty() && height[i] > height[stack.peek()]) { int top = stack.pop(); if (!stack.isEmpty()) { int left = stack.peek(); water += (Math.min(height[left], height[i]) - height[top]) * (i - left - 1); } } stack.push(i); } return water; } // 双指针 public int trap3(int[] height) { if (height.length == 0) { return 0; } int left = 0; int right = height.length - 1; int leftMax = 0; int rightMax = 0; int water = 0; for (; left < right; ) { leftMax = Math.max(leftMax, height[left]); rightMax = Math.max(rightMax, height[right]); if (height[left] < height[right]) { water += leftMax - height[left]; left++; } else { water += rightMax - height[right]; right--; } } return water; } }