11. 盛最多水的容器

11. 盛最多水的容器

题目

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。
在这里插入图片描述

思路

做过接雨水的题目之后,感觉这道题和他差不多,所以第一感觉是O(N)可以做出来的。
还是采用的接雨水的思路,用双指针,l和r。
开始的时候,l=0,r=n-1,此时可以计算出存水量,length*depth。depth由最小的左右边界决定,而length由l和r的位置决定。
随着指针的移动,length肯定是慢慢减小的,如果最大存水量出现在中间位置,那么说明depth肯定是很大的。那么,对于l和r,每次移动其最小的那个,直到l和r相遇,此时结束,返回记录的最大水量。
为什么要移动最小的指针,因为,每次移动,length肯定是减小的,要找最大水量,只能找更大depth,所以移动最小的指针,去找下一个边界位置,毕竟depth是由左右边界的最小值决定的。

这个算法没有严格的证明,leetcode官方题解也是这种做法,他的说明更加有说服力
https://leetcode-cn.com/problems/container-with-most-water/solution/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/

代码

    public int maxArea(int[] height) {
        int n = height.length;
        int l = 0;
        int r = n-1;
        int max_ = 0;
        while(l<=r){
            if(height[l]<height[r]){
                max_ = Math.max(max_,(r-l)*height[l]);
                l++;
            }else{
                max_ = Math.max(max_,(r-l)*height[r]);
                r--;
            }
        }  
        return max_ ;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值