给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
https://leetcode-cn.com/problems/trapping-rain-water/
示例1:
示例2:
提示:
Java解法
package sj.shimmer.algorithm.ten_3;
/**
 * Created by SJ on 2021/2/18.
 */
class D25 {
    public static void main(String[] args) {
        System.out.println(trap(new int[]{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}));
        System.out.println(trap(new int[]{4, 2, 3}));
    }
    public static int trap(int[] height) {
        int result = 0;
        if (height != null && height.length != 1) {
            int left = 0;
            int temp = 0;
            boolean hasLeft = false;
            int length = height.length;
            for (int i = left; i < length; i++) {
                if (!hasLeft) {
                    if (height[i] != 0) {
                        left = i;
                        hasLeft = true;
                    }
                } else {
                    if (height[i] >= height[left]) {
                        result += temp;
                        temp = 0;
                        left = i;
                    } else {
                        temp += height[left] - height[i];
                        if (i == length - 1) {
                            temp = 0;
                            int right = length - 1;
                            //当前left是最长的柱子,进行逆向求取
                            for (int j = length - 1; j > left; j--) {
                                if (height[right] == 0) {
                                    right = j;
                                    continue;
                                }
                                if (height[j] >= height[right]) {
                                    result += temp;
                                    temp = 0;
                                    right = j;
                                } else {
                                    temp += height[right] - height[j];
                                    if (j == left + 1) {
                                        return result + temp;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return result;
    }
}

官方解
https://leetcode-cn.com/problems/trapping-rain-water/solution/jie-yu-shui-by-leetcode/
- 
暴力
- 时间复杂度: O(n^2)
 - 空间复杂度: O(1)
 
 - 
动态编程
- 时间复杂度: O(n)
 - 空间复杂度: O(n)
 
 - 
栈的应用
- 时间复杂度: O(n)
 - 空间复杂度: O(n);最坏情况下
 
 - 
双指针
- 时间复杂度: O(n)
 - 空间复杂度: O(1)
 
 










