leetcode-Container With Most Water

Container With Most Water

  Total Accepted: 11787  Total Submissions: 38592 My Submissions

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

题意:x轴整数坐标i上有高为h[i]的竖直板,求哪两个板围起来的面积最大。、

分析:简单的思路是枚举两个板,时间复杂度是O(n^2)

看到discuss里有一个O(n)的方法,头尾两指针向内移动,每次找两个指针中较低的板,该指针向内移动,可证明其为最优解

证明:反证法

设最优解为[left,right],且我们的O(n)方法未找到这个解

由于我们的方法两个指针遍历了所有n个板,所以left,right中至少有一个在我们的方法中被遍历到

设被遍历到的是left,那么在遍历到left时,在下列两种情况下,指针才会离开left向右移动:

(1)右指针也指向left,这时循环终止。但此时,右指针必然遍历到了right,所以矛盾

(2)右指针到达arr,且height[arr]>height[left],由于我们的方法没遍历到right,所以arr一定在right右边,那么可推出arr和left围上的面积一定比left和right围上的面积大,矛盾

所以,我们的方法找到的为最优解


代码:

class Solution {
public:
    int maxArea(vector<int> &height) {
        int ans = 0;
        int l=0, r=height.size()-1;
        while(l<r)
        {
            int now = min(height[l],height[r])*(r-l);
            if(now>ans) ans = now;
            if(height[l]<height[r]) l++;
            else r--;
        }
        return ans;
    }
};



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值