LeetCode_11_Container With Most Water

本文详细解析了在给定的坐标点中寻找两条线段,使其与x轴构成的容器能容纳最大储水量的算法。介绍了暴力求解法与双指针法两种策略,对比了它们的时间与空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。、

解题思路(官方思路):
method1:暴力求解思想:将所有的两两垂直线的组合搭配起来求解最大面积,设置一个全局变量maxValue来记录最大储水量
在接下来的两两直线组合的求解储水量的过程中,如果当前组合的储水量比,全局的最大储水量还要大,则更新全局最大
储水量.当所有的两两组合运行结束后,maxValue中存放的就是最大储水量,返回即可.
(此方法时间复杂度太大)
时间复杂度O(n2),空间复杂度O(1)

int maxValue=0;//用于记录最大储水量
        for(int i=0;i<height.size();i++){
            for(int j=i+1;j<height.size();j++){//所有线段长度的组合
                int tempValue=min(height[i],height[j])*(j-i);//计算当前组合的储水量
                if(tempValue>maxValue)
                    maxValue=tempValue;
            }
        }
        return maxValue;

下图是采用暴力法的运行时间图
在这里插入图片描述

method2:双指针法:由题意易知,最大储水量是有两条边中最短边的高度和两条边之间的x轴的距离所决定的,我们要想的到最大储水量,就需要移动最短边,虽然这样做可能会使x轴的长度变小,但是可能会换取一条更长的边,所以总的面积有可能会增大。如果替换最大边,储水量还是由最短的那条边所决定的,反倒会使x轴的距离缩小,所以不会对结果有任何好的帮助。
采用此种方法时间复杂度为O(n),空间复杂度O(1)

int low=0;
        int high=height.size()-1;
        int maxValue=0;//用于记录全局最大储水量
        while(low<high){
            int tempValue=min(height[low],height[high])*(high-low);//记录当前组合的储水量
            if(tempValue>maxValue)
                maxValue=tempValue;//更新最大储水量
            if(height[low]<height[high])//将当前组合中较短的边进行替换
                low++;
            else
                high--;
        }
        return maxValue;

下图是采用双指针法的运行时间图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值