【LeetCode】11. 盛最多水的容器_双指针


题目描述

11. 盛最多水的容器
在这里插入图片描述

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

考察点

第一次:2022年12月14日11:22:46

经典的双指针的解题思路

由于容纳的水量是由 两个指针指向的数字中较小值 * 指针之间的距离;

那么,如何移动指针呢?移动数字较小的那个指针

为什么保证这个双指针得到的最优解是本题的最优解?,可以查看官方的证明。

代码展示

class Solution {
    public int maxArea(int[] height) {
        int result = 0;
        int i = 0;
        int j = height.length - 1;
        while (i < j) {
            int cur = Math.min(height[i], height[j]) * (j -i);
            result = Math.max(cur, result);
            if (height[i] <= height[j]){
                i++;
            }else {
                j--;
            }
        }
        return result;
    }
}

2023-8-25 09:18:18

第二次了,还是想到了两层for循环。超时了。Orz

附上双指针的代码实现

class Solution {
    public int maxArea(int[] height) {
        
        int i= 0, j = height.length -1, res = 0;

        // 两指针 i j 相遇时跳出循环
        while(i < j){
            // 移动短板
            // i是短板的话,  (j - i ) *  height[i] 得到最新的面积, 并与当前最大面积比较,取最大的一个作为当前最大面积,并下标向右移动一次
            // j是短板的话,  (j - i ) *  height[j] 得到最新的面积, 并与当前最大面积比较,取最大的一个作为当前最大面积,并下标向左移动一次
            res = height[i] < height[j]?
                Math.max(res, (j - i ) *  height[i++]):
                Math.max(res, (j - i ) *  height[j--])
        }
        return res;
    }
}

作者:Krahets
链接:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值