【刷题】LC-42:接雨水

题目描述:

【刷题】LC-42:接雨水_第1张图片

暴力法:

在当前位置,分别向左向右寻找最大高度的立方体,然后用
min(l_max, r_max) - height[i] 就是当前位置能接的雨水。

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int ans = 0;
        for (int i = 0; i < n - 1; i++) {
            int l_max = 0;
            int r_max = 0;
            for (int j = i; j < n; j++) {
                r_max = Math.max(r_max, height[j]);
            }
            for (int j = i; j >= 0; j--) {
                l_max = Math.max(l_max, height[j]);
            }
            ans += Math.min(l_max, r_max) - height[i];
        }
        return ans;
    }
}

第一次优化:备忘录法。

暴力法比较低效,原因是在遍历每个当前位置的时候,都会去重复计算l_max和r_max,因此我们在开始的时候先计算出来,等用的时候直接拿就行了,省去了重复计算的过程。速度也会比暴力法快很多。

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int ans = 0;
        int[] l_max = new int[n];
        int[] r_max = new int[n];
        l_max[0] = height[0];
        r_max[n - 1] = height[n - 1];
        for (int i = 1; i < n; i++) {
            l_max[i] = Math.max(height[i], l_max[i - 1]); 
        }

        for(int i = n -2; i >= 0; i--) {
            r_max[i] = Math.max(height[i], r_max[i + 1]);
        }

        for (int i = 0; i < n - 1; i++) {
            ans += Math.min(l_max[i], r_max[i]) - height[i];
        }
        return ans;
    }
}

暴力法和备忘录法的时间差距也是非常大的:

【刷题】LC-42:接雨水_第2张图片

接着我们再进行优化,把上述备忘录算法的空间复杂度给优化到O(1)。

终极解法:双指针。

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int left = 0;
        int right = n - 1;
        int ans = 0;

        int l_max = height[0];
        int r_max = height[n - 1];
        
        while (left <= right) {
            l_max = Math.max(l_max, height[left]);
            r_max = Math.max(r_max, height[right]);

            if (l_max < r_max) {
                ans += l_max - height[left];
                left++;
            } else {
                ans += r_max - height[right];
                right--;
            }
        }

        return ans;
    }
}

参考文章:
labuladong的算法小抄
https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247484482&idx=1&sn=9503dae2ec50bc8aa2ba96af11ea3311&source=41#wechat_redirect

你可能感兴趣的:(LeetCode,算法)