接雨水问题

该代码实现了一个计算数组中形成的水量的算法。通过双指针技巧,分别从数组的两端开始,找到左右两侧的最小值作为水位高度,并不断更新水位,最终累加得到总水量。在遍历过程中,若左侧元素较小,则移动左指针,反之移动右指针。同时,根据当前指针位置更新水位高度。整个过程有效地减少了时间复杂度。

  public static long maxWater(int[] arr) {
        if (arr == null || arr.length <= 2) {
            return 0;
        }
        int left = 0;
        int right = arr.length - 1;
        long sum = 0;
        // 找出左右边界的最小值作为水位高度
        int minHeight = Math.min(arr[left], arr[right]);
        while (left < right) {
            // 如果左边较低,则左边界向右遍历, 否则右边界向左移动
            if (arr[left] < arr[right]) {
                left++;
                // 如果当前标尺小于水位,则水量累加
                if (minHeight > arr[left]) {
                    sum += minHeight - arr[left];
                } else {
                    // 否则,将此标尺和右边边界高度进行比较,找出剩下数组中的新水位
                    minHeight = Math.min(arr[left], arr[right]);
                }
            } else {
                right--;
                // 同理,如果当前标尺小于水位,则水量累加
                if (minHeight > arr[right]) {
                    sum += minHeight - arr[right];
                } else {
                    // 否则,将此标尺和左边界的高度进行比较,找出剩余数组中的新水位
                    minHeight = Math.min(arr[left], arr[right]);
                }
            }
        }
        return sum;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值