当前位置: 首页 > news >正文

双指针算法专题之——盛最多水的容器

文章目录

  • 题目介绍
  • 思路分析
    • 暴力枚举(超时)
    • 优化:左右指针
  • AC代码

题目介绍

链接: 11. 盛最多水的容器

在这里插入图片描述

思路分析

暴力枚举(超时)

首先这道题最容易想到的就是暴力枚举,枚举所有的情况,选出最大值就是

在这里插入图片描述
但是!不好意思,超时了
在这里插入图片描述

那如何优化呢?

优化:左右指针

我们来分析一下:

看题目中的示例1
在这里插入图片描述
不过我们可以取出一个小的区间来看,便于分析
在这里插入图片描述
我们可以先来看两个端点值6和4与x轴组成的容器的储水量,其实就是面积。
高分别是6和4。
在这里插入图片描述
根据木桶原理,能存多少水取决于最短的那块板,所以高就是4,宽是3,容量就是12
那如果是4和5呢?
高不变,宽减小,容量必减小。
那4和2呢?
高和宽都减小了,容量必定也减小。

这样其实就发现了一个规律:

如果从区间的两个端点开始判断,两个端点中小的那一个数,另一端向内收缩,容量必定会减小,我们只需要记录两端点组成容器的容量(它一定是当前区间储水量的最大值)。
在这里插入图片描述
因为向内收的话,宽度一定减小,而高度要么不变,要么也减小。
所以两个端点中小的那一个数就可以直接排除了!
然后在剩下的区间中,依然是这样的规律,只需记录当前区间两端点组成的容器大小,然后两个端点中小的那个数直接排除!
后续都是这样,最后在我们记录的每一个区间的容量中,最大值就是结果

所以我们就可以用左右指针,从两端往中间走,进行判断即可。

AC代码

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

过啦!

    // 左右指针 O(n)
    int maxArea(vector<int>& height) 
    {
        int left = 0;
        int right = height.size() - 1;
        int max = 0;
        while (left < right) 
        {
            int area = (right - left) * min(height[left], height[right]);
            if (area > max)
                max = area;
            if (height[right] < height[left])
                right--;
            else
                left++;
        }
        return max;
    }

相关文章:

  • 字母的贡献度
  • 【算法思想】前缀和
  • 前端Html5 Canvas面试题及参考答案
  • Harbor 高可用部署
  • 【RH124】第一章 红帽企业Linux入门
  • 李白打酒加强版--dfs+记忆化搜索
  • Cursor插件市场打不开解决
  • JMX 和 JAAS 认证
  • 【数据结构】栈和队列
  • 【NLP】 9. 处理创造性词汇 词组特征(Creative Words Features Model), 词袋模型处理未知词,模型得分
  • 3.4 基于TSX的渲染函数类型安全实践
  • Java中的I/O
  • Hive函数大全:从核心内置函数到自定义UDF实战指南(附详细案例与总结)
  • Python中的unittest库
  • Java 并发编程——BIO NIO AIO 概念
  • C语言:基于数组实现栈
  • 如何打包数据库mysql数据,并上传到虚拟机上进行部署?
  • pandas表格内容比较
  • 数据链路层协议
  • 共享内存通信效率碾压管道?System V IPC原理与性能实测
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 中国新闻发言人论坛在京举行,郭嘉昆:让中国声音抢占第一落点
  • 遭车祸罹难的村医遇“身份”难题:镇卫生院否认劳动关系,家属上诉后二审将开庭
  • 俄媒:俄乌代表团抵达谈判会场
  • 中央提级巡视后,昆明厅官郭子贞接受审查调查
  • 江苏省委组织部副部长高颜已任南京市委常委、组织部部长