LeetCode 11. 盛最多水的容器(缩减搜索范围)

思路:
定义两个指针 left 和 right ,开始分别让他们指向数组的最左边和最右边,代表容器的最大边界,然后设left所指的值为x,right所指的指为y。
假设下 x <= y 则当前容器体积为 v = min(x,y)×(right-left),即 x×(right-left),然后移动右指针到任意位置,这时右指针指向了y1。
v1 = min(x,y1)×(right-left)
当 y1 >= y 时,min(x,y1) = x,而 right-left 变小了,v1 < v
当 y1 < y 时,min(x,y1)<=y,right-left变小,v1 < v
因此,无论如何移动右指针,容积都会变小,所以就不能再以做指针为容器的边界。
所以,因该移动左指针,这样以左指针为边界的所有情况。
依次类推,每次都移动短板,就可以找到最大容积

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length-1;
        int v,maxV = 0;
        while(left < right) {
            v = Math.min(height[left],height[right])*(right-left);
            if(v > maxV) maxV = v;
            int i = height[left] > height[right]? right-- : left++;
        }
        return maxV;
    }
}

参考题解:
[https://leetcode-cn.com/problems/container-with-most-water/solution/on-shuang-zhi-zhen-jie-fa-li-jie-zheng-que-xing-tu/]

反思:
再验证方法的正确性时,试着举例将所有情况画出来。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值