leecode100_第5题_盛最多水的容器_双指针_O(n)

1 题目

在这里插入图片描述
在这里插入图片描述

2 分析

两个板的面积=min(height[i],height[j])*(j-i)


思路一:
两个指针分别指向最左和最右端,假设随便移动两个指针,就能暴力穷举所有的情况,求最大值即可。(其实也就是双重for循环的写法)
时间复杂度:O(n^2)


思路二:
但是指针的移动是可以有规律的:两个指针分别指向最左和最右端,选取更短板的指针向中间移动。
这样时间复杂度减为:O(n)

为什么可以这样操作呢?

解释:

  • 如果我们移动指向长的板的指针向里,两个板的距离(j-x-i)在变小,面积的高度要么不变,要么会变小,没必要考虑,因此我们就不枚举这种情况,把它排除了。
  • 如果我们移动指向短的板的指针向里,两个板的距离(j-x-i)在变小,面积的高度变大、变小、不变都有可能,因此需要我们去枚举
  • 那么为啥不考虑往外移动呢?两个板的距离在变大呀。笨蛋,我们就是从外往里移动的呀,那种情况已经考虑了。

3 代码

class Solution {
public:
    int maxArea(vector<int>& height) {
       int i=0;
       int ans=0;
       int j=height.size()-1;
       while(i<j){//两个指针
           if(height[i]<=height[j]){
               ans=max(ans,(j-i)*height[i]);//更新最大值
               i++;
           }
           else if(height[i]>height[j]){
               ans=max(ans,(j-i)*height[j]);
               j--;
           }
       }
       return ans;
    }
};
leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MORE_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值