[LeetCode42. 接雨水] | 刷题打卡

122 阅读1分钟

题目描述

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

image.png

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出:6

解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

解题思路

  • 暴力法解决这个问题,首先从横向坐标来看某个位置能装的水water[i]=max(i位置左边的最高的柱子,i位置右边的最高柱子)-这个位置的

  • 备忘录优化

  • 双指针的解法

  • 与滑动窗口方法的比较

  • 什么是单调栈

AC 代码

  • 暴力法代码
class Solution {
    public int trap(int[] height) {
        
        int sum=0;

        for(int i=0;i<height.length;i++){
          int leftMax=0;
          int rightMax=0;
           for(int j=i;j>=0;j--){
               leftMax=Math.max(height[j],leftMax);
           }
            for(int j=i;j<height.length;j++){
               rightMax=Math.max(height[j],rightMax);
           }
            sum+=Math.min(leftMax,rightMax)-height[i];
        }
        return sum;

    }
}
  • 备忘录代码
class Solution {
    public int trap(int[] height) {   
        if(height.length==0){
            return 0;
        }  
        int sum=0;
        int n=height.length;
        int[] left=new int[n];
        int[] right=new int[n];
        left[0]=height[0]; 
        right[n-1]=height[n-1];
        for(int i=1;i<n;i++){
            left[i]=Math.max(height[i],left[i-1]);
        }
        for(int i=n-2;i>=0;i--){
            right[i]=Math.max(height[i],right[i+1]);
        }
        for(int i=1;i<n;i++){
            sum+=Math.min(left[i],right[i])-height[i];
        }

        return sum;

    }
}

  • 双指针解法
class Solution {
    public int trap(int[] height) {   
        
        int n=height.length;
        if(n==0){
            return 0;
        }
        int left=0;
        int right=n-1;
        int leftMax=height[0];
        int rightMax=height[n-1];
        int res=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;
    }


总结

下次补上