接雨水

https://mp.weixin.qq.com/s/f9ebzbwymR8jQeUDxjeCDA
暴力
class Solution {public int getMax(int[] nums, int l, int r){int res = nums[l];for(int i = l; i <= r; i++){res = Math.max(res, nums[i]);}return res;}public int trap(int[] height) {int res = 0;for(int i = 1; i < height.length - 1; i++){int maxL = getMax(height, 0, i - 1);int maxR = getMax(height, i + 1, height.length - 1);if(maxL > height[i] && maxR > height[i]){res += Math.min(maxL, maxR) - height[i];}}return res;}}
dp记录-左右最大值
class Solution {public int trap(int[] height) {int n = height.length;if(n == 0) return 0;//dp[i][0] i左边最大值//dp[i][1] i右边最大值int[][] dp = new int[n][2];dp[0][0] = height[0];dp[n - 1][1] = height[n - 1];for(int i = 1; i < n; i++){dp[i][0] = Math.max(dp[i - 1][0], height[i]);}for(int i = n - 2; i >= 0; i--){dp[i][1] = Math.max(dp[i + 1][1], height[i]);}int res = 0;for(int i = 1; i < n - 1; i++){res += Math.min(dp[i][0], dp[i][1]) - height[i];}return res;}}
双指针
class Solution {public int trap(int[] height) {int res = 0;int l = 0, r = height.length - 1;int lmax = 0, rmax = 0;while(l <= r){if(lmax <= rmax){lmax = Math.max(lmax, height[l]);res += lmax - height[l++];}else{rmax = Math.max(rmax, height[r]);res += rmax - height[r--];}}return res;}}
单调栈
这道题目可以用单调栈来做。单调栈就是比普通的栈多一个性质,即维护栈内元素单调。
比如当前某个单调递减的栈的元素从栈底到栈顶分别是:[10, 9, 8, 3, 2],如果要入栈元素5,需要把栈顶元素pop出去,直到满足单调递减为止,即先变成[10, 9, 8],再入栈5,就是[10, 9, 8, 5]。
