盛水最多的容器 贪心+双指针

描述

给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水。


方法

容积=最短边*底边

左指针left从数组首向右扫描,右指针right从数组尾向左扫描, 

起始时刻,left指向首元素,right指向尾元素,容积=min(height[left],height[right])*(right-left)。

此时,左右两条边中有一条较短的边,不妨假设height[left]<=height[right],即左边的边较短。

下面有两种走法:

(1)左指针向右移动一步

容积=min(height[left+1],height[right])*(right-left-1)

height[right]不变,height[left+1]可能变大、也可能变小,(right-left-1)变小,容积有可能变大。

(2)右指针向左移动一步

容积=min(height[left],height[right-1])*(right-1-left)

height[left]不变,又因为height[left]<=height[right],所以最短边长min(height[left],height[right-1])不会变大,底边长(right-1-left)变小,容积变小。

因此,为寻找容积最大值,应当使较短边的指针移动(相当于进行了剪枝,已知某部分搜索空间不可能存在更优解,便不再搜索这一部分空间)。

搜寻终止条件:left>=right,变量res维护最大容积。


C++代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        //排除不能形成容器的情况
        if(height.size() < 2) 
            return 0;
        int res = 0; 
        //双指针左右界
        int left = 0; 
        int right = height.size() - 1;
        //共同遍历完所有的数组
        while(left < right){ 
            //计算区域水容量
            int capacity = min(height[left], height[right]) * (right - left);
            //维护最大值 
            res = max(res, capacity); 
            //优先舍弃较短的边
            if(height[left] < height[right]) 
                left++;
            else
                right--;
         }
        return res;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值