算法:接水滴

2023-10-03  本文已影响0人  小天使999999

题目

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

示例 1:
示例

输入: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 个单位的雨水(蓝色部分表示雨水)。

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

Java代码实现

class Solution {
    public int trap(int[] height) {

        int left = 0;
        int right = height.length - 1;
        int leftMax = 0;
        int rightMax = 0;
        int total = 0;

        while (left <= right) {
            if (height[left] <= height[right]) {
                if (height[left] > leftMax) {
                    leftMax = height[left];
                } else {
                    total += leftMax - height[left];
                }
                left++;
            } else {
                if (height[right] > rightMax) {
                    rightMax = height[right];
                } else {
                    total += rightMax - height[right];
                }
                right--;
            }
        }

        return total;
    }
}

算法解释

这段代码是使用双指针的方法来解决接雨水问题。

  1. 首先,定义两个指针left和right,分别指向数组的第一个元素和最后一个元素。

  2. 然后,定义两个变量leftMax和rightMax,分别用来保存左边和右边的最大高度。

  3. 接着,定义一个变量total用来保存接雨水的总量。

  4. 在循环中,当left <= right时,进行以下操作:
    i. 如果height[left] <= height[right],说明左边的高度较小,那么可以确定左边能接到的雨水量,即leftMax - height[left],将这个结果累加到total中。
    然后更新leftMax的值,如果height[left]大于leftMax,将leftMax更新为height[left]。
    最后,将left指针向右移动一位。
    ii. 如果height[left] > height[right],说明右边的高度较小,那么可以确定右边能接到的雨水量,即rightMax - height[right],将这个结果累加到total中。
    然后更新rightMax的值,如果height[right]大于rightMax,将rightMax更新为height[right]。
    最后,将right指针向左移动一位。

  5. 循环结束后,返回total即为最后的结果,即接到的雨水总量。

这个方法的时间复杂度是O(n),其中n是数组的长度。

上一篇 下一篇

猜你喜欢

热点阅读