牛客网刷题-容器盛水问题

问题描述

容器最多能称多少水,因为容器的高度是一个数组,我们可以通过遍历数组,计算每一格子的盛水量,累加得最高的盛水量。

示例

示例1

输入
[3,1,2,5,2,4]

输出
5

解决思路

分析

  1. 容器最多能称多少水,因为容器的高度是一个数组,我们可以通过遍历数组,计算每一格子的盛水量,累加得最高的盛水量。

方法

  1. 暴力求解:遍历元素,以当前元素为基准,向左找最高的高度leftHeight,向右找最高的高度rightHeight,计算当前格子的盛水量:water=min(leftHeight, rightHeight) - curHeight
  2. 双指针法:从左右两边同时开始检索,分别找最高的Height,比对左右两边的Height,取低的Height,计算盛水量,然后剔除当前格子,继续计算。(注意:这里无法同时计算两边,因为我们取得是低的Height,取高的Height会存在漏水问题)
    在这里插入图片描述
// 过程:
第0次循环:lmax = 3、rmax = 4
第0列的盛水量:0

第1次循环:lmax = 3、rmax = 4
第1列的盛水量:2

第2次循环:lmax = 3、rmax = 4
第2列的盛水量:1

第3次循环:lmax = 3、rmax = 4
第5列的盛水量:0

第4次循环:lmax = 5、rmax = 4
第4列的盛水量:2

第5次循环:lmax = 5、rmax = 4
第3列的盛水量:0

代码实现

// 思路2
public class Solution {
    
      
    public long maxWater (int[] arr) {
    
    
        // write code here
        if(arr==null || arr.length==0) return 0L;
        long ans = 0;
        int l=0, r=arr.length-1;
        int lmax = arr[0], rmax=arr[arr.length-1];
        while(l<=r) {
    
    
            lmax = Math.max(arr[l], lmax);
            rmax = Math.max(arr[r], rmax);
            if(lmax < rmax) {
    
    
                ans += lmax - arr[l];
                l++;
            } else {
    
    
                ans += rmax - arr[r];
                r--;
            }
        }
        return (long) ans;
    }
}

时间复杂度分析:
O(N):遍历数组

空间复杂度分析:
O(1):没有使用额外的空间

小伙伴如果想测试的话,可以直接到牛客网这个链接做测试

容器盛水问题-牛客网

猜你喜欢

转载自blog.csdn.net/qq_35398517/article/details/113996337