盛水最多的容器 ---- 双指针

本文介绍了如何在给定的整数数组表示的二维空间中,使用左右指针法找到最大面积的方法,通过比较边界值与内部值来逐步缩小搜索范围,有效降低了时间复杂度。作者提供了一段Java代码实现这一问题的解决方案。
摘要由CSDN通过智能技术生成

题目链接

题目:

分析:

  • 最大容积 即使就是最大面积, 长为下标之差, 宽为两下标对应值的最小值
  • 解法一: 暴力枚举: 将每两个数之间的面积都求出来, 找最大值, 时间复杂度较高
  • 解法二: 
    • 假设我们的数组是[6, 2, 5, 4], 我们先假设最左边和最右边, 即6 和 4 之间是最大面积长a*宽b
    • 此时我们拿较小的那个数也就是4, 继续和中间的数进行比较
      • 如果遇到的是2, 即比4小的数,  那么a在减小, b也在减小, 面积肯定比刚才小, 所以不需要考虑2 和 4 了
      • 如果遇到的是5, 即比4大的数, 此时a减小, 而b是不变的(宽还是4), 所以面积还是比原来小
    • 得出结论: 找到最左边和最右边的数的最小值, 那么拿着这个最小值和中间的任何一个数相比, 都没有原来的面积大, 所以我们要拿着最大值, 继续比较下去, 并比较面积, 记录下最大的面积

思路:

  1. 在左右各定义两个变量 left 和right, 计算此时的面积, 存放在max变量中, 这个变量存放最大面积
  2. 若left指向的是较小的值, 则left++, 并比较此时的面积与max, 如果大于max,则把此时的值给max, 若right指向的是较小的值, 则right-- ,并比较此时的面积与max, 如果大于max,则把此时的值给max
  3.  直到两指针相遇, 遍历完全部元素, max中存放的就是最大面积

代码:

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length-1;
        int max = 0;
        while(left < right){
            int min = Math.min(height[left],height[right]);
            int area = (right - left) * min;
            max = Math.max(max,area);
            if(min == height[left]){
                left++;
            }else{
                right--;
            }

        }
        return max;

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值