盛最多水的容器


在这里插入图片描述
示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

如题意,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩形区域的长度,而我们必须最大化该矩形区域的面积

暴力破解

解题思路
简单考虑每队可能出现的线段组合,并找出这些情况之下的最大面积
时间复杂度:O(n²),两个for循环
空间复杂度:O(1)

class Solution {
    public int maxArea(int[] height) {
        int maxArea=0;
        for(int i=0; i<height.length; i++)
            for(int j=i+1; j<height.length; j++)
                maxArea =Math.max(Math.min(height[i], height[j])*(j-i) ,maxArea);
        
        return maxArea;
    }
}
双指针法:缩短区间

两线段之间形成的区域总是会受到其中较短那条长度的限制

我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。
并将指向较短线段的指针向较长线段那端移动一步。

移动短指针的过程中,一定会遇到可以构成最大面积的情况

反证法
假设移动长指针,移动到next位置,容器宽度变小
若height[next] < height[pa],容器高度 = height[next],高度变小
height[pa]< height[next] < height[pb],容器高度 = height[pa],高度不变
height[next] > height[pa],器高度 = height[pa],高度不变

以上三种情况都会导致容器面积变小,所以移动长指针不会遇到构成最大面积的情况

时间复杂度:O(n),一次扫描
空间复杂度:O(1),使用恒定的空间

class Solution {
    public int maxArea(int[] height) {
        int pa = 0;
        int pb = height.length-1;
        int maxArea = 0;
        int nowArea = 0;
        while(pa != pb){       
            if(height[pa] <= height[pb]){
                nowArea = (pb-pa)*height[pa];
                pa++;
            }else{
                nowArea = (pb-pa)*height[pb];
                pb--;
            }
            maxArea = (nowArea>maxArea)?nowArea:maxArea;
        }
        return maxArea;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值