牛客刷题——盛水的容器

题目:给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。

eg :  输入:[3,1,2,5,2,4],输出:5

太笨了太笨了,做过一遍了还不会。

这道题目陷入的误区是想着先确定容器,确定了之后再计算容量,但是。。。也不知道是啥原因,最后一个用例过不了,只能参考答案。

其实可以动态的确定容器和更新容器。

首先使用双指针,left 和 right 分别指向数组的两端,然后使用lMax记录左容器的高度,使用rMax记录右容器的高度,然后对整个数组进行一次遍历,需要注意的是,容器的容量是取决于短板的,需要使用最短的那一侧来确定容器的容量,因此在进行处理的时候只需要对 lMax 和 rMax 中小的那个进行处理,也就是对短板进行处理,然后动态的去更新边界和计算容量即可。

1. 每次更新 lMax 和 rMax ,取 lMax 为 max ( lMax , arr[left] ),同理取 rMax,这里更新边界是确定新的容器。
2. 判断 lMax 和 rMax 的大小,决定处理哪一边,假设 lMax < rMax,max += lMax - arr[left++],同理处理right,这里只考虑小的那边,是因为容量是有由短边确定的。

完整代码如下:

public static long maxWater (int[] arr) {
        // write code here
		if(arr.length==0||arr.length==1) {
			return 0L;
		}
		long max = 0;
		int left = 0,right = arr.length-1;
		int lMax = arr[left];
		int rMax = arr[right];
		while(left<right) {
			lMax = Math.max(lMax, arr[left]);
			rMax = Math.max(rMax, arr[right]);
			if(lMax<rMax) {
				max += lMax-arr[left++];
			}else {
				max += rMax-arr[right--];
			}
			
		}
		return max;
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值