LeetCode11-盛水最多的容器

该博客介绍了LeetCode第11题的解决方案,通过两种方法求解盛水最多的容器:暴力遍历(O(n^2)时间复杂度)和双指针优化(O(n)时间复杂度)。双指针策略通过不断更新较小高度的指针,寻找更大面积的可能性,从而降低时间复杂度。
摘要由CSDN通过智能技术生成

题目:

给定一个高度数组,找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

思路

1. 暴力解法

由于题目中,要求的是找出其中的两条线,与x轴构成的容器,也就是说,找出数组中所有可能的两个高度的组合,很显然有\frac{n(n-1))}{2}种组合。

具体的遍历思路

[0] [1-n]

[1] [2-n]

...

代码:

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(maxarea,Math.min(height[i],height[j])*(j-i));
            }
        }
        
        return maxarea;
    }
}

时间复杂度:O(n^2)

空间复杂度:O(1)

 

思路2:用双指针,朝着area可能变大的方向搜索

我们来看一下area的计算公式 area = min(height[l],height[r])*(r-l)

r-l肯定是不断减小的

那么,area主要就是由min(height[l],height[r])这一项决定的,那么怎样才能让这一项变大呢?

显然,只要让这里面的小值变大就行,也就是取里面的小值,然后变索引,直到遇到比当前height大的索引。

也就是说,把最外边的两条height中的小值往大的变。

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

时间复杂度:O(n),只需要扫描一次

空间复杂度:O(1)

这道题的优化思路在于,

目标是得到最大的面积,那么从area计算的方式出发,向area可能变大的方向搜索即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值