其他分享
首页 > 其他分享> > 【每日一题】【动态规划】【双指针】2021年11月30日-42. 接雨水

【每日一题】【动态规划】【双指针】2021年11月30日-42. 接雨水

作者:互联网

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

 

 四种解法:常规方法、动态规划、双指针一次优化

还有其他:单调栈方法

//传统做法
class Solution {
    public int trap(int[] height) {
        int res = 0;
        int size = height.length;
        for(int i = 1; i < size - 1; i++) {
            int leftMax = 0, rightMax = 0;
            for(int j = i; j >= 0; j --) {
                leftMax = Math.max(leftMax, height[j]);
            }
            for(int j = i; j < size; j++) {
                rightMax = Math.max(rightMax, height[j]);
            }
            res += Math.min(leftMax, rightMax) - height[i];
        } 
        return res;
    }
}
//动态规划
//注意动态规划递推式的左边下标都是i
class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int res = 0;
        int[] leftMax = new int[n]; 
        leftMax[0] = height[0];
        for(int i = 1; i < n; i++) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }
        int[] rightMax = new int[n];
        rightMax[n - 1] = height[n - 1];
        for(int i = n - 2; i >= 0; i--) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        } 
        for(int i = 0; i < n; i++) {
            res += Math.min(leftMax[i], rightMax[i]) - height[i];
        }
        return res;
    }
}
//双指针
class Solution {
    public int trap(int[] height) {
        int res = 0; 
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        while(left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if(leftMax < rightMax) {
                //最小值-当前值后再变左右(变小的一方)
                res += leftMax - height[left];
                left++;
            } else {
                res += rightMax - height[right];
                right--;
            }
        }
        return res;
    }
}

 

标签:11,leftMax,rightMax,int,res,30,42,height,Math
来源: https://www.cnblogs.com/liujinhui/p/15626289.html