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

【力扣】盛最多水的容器,双指针法

盛最多水的容器原题地址

方法一:双指针

如果使用暴力枚举,时间复杂度为O(N^2),效率太低,会超时。

考虑使用双指针,利用单调性求解。用left和right作为数组height的下标,分别初始化为0和size-1。考虑在区间[left,right]的范围内,理论上会有C_{right-left+1}^{2}种配对可能,但其中有一些情况不需要再考虑。其中容量=高度*宽度,即area=min(height[left],height[right])*(right-left)

不妨设height[left]<height[right],区间下标的所有可能取值为:

left left+1 left+2 ... right-2 right-1 right

那么left如果与[left+1,right-1]的值(记为m)配对,其area值一定比left与right配对小,为什么呢?这是因为宽度减小了,高度减小或不变(见下面的2种情况)。

  1. 若height[m]>height[left],那么高度不变,仍然为height[left]。
  2. 若height[m]<height[left],那么高度减小为height[m]。

所以我们不需要考虑left与除了right之外的其余值配对,让left指针右移为left+1,在[left+1,right]的范围内寻找新的配对。同理,若height[left]>height[right],让right指针左移为right-1,在[left,right-1]的范围内寻找新的配对。若height[left]=height[right],可归为前面任意一类。

这样,每次都可以缩减配对的范围,直到left和right相遇为止,其时间复杂度为O(N)。

// 方法一:双指针
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1;
        int ans = 0;
        while (left < right)
        {
            // 计算容量
            int area = min(height[left], height[right]) * (right - left);
            ans = max(ans, area);

            // 高度小的那边不可能作为边界
            // 这是因为如果高度小的那边和其他边匹配,
            // 宽度会减小,高度不会增加,所以容量会减小
            if (height[left] < height[right])
            {
                ++left;
            }
            else
            {
                --right;
            }
        }

        return ans;
    }
};


http://www.kler.cn/a/231497.html

相关文章:

  • PH热榜 | 2024-11-19
  • 【东莞石碣】戴尔R740服务器维修raid硬盘问题
  • IDEA2023 SpringBoot整合Web开发(二)
  • vue2动态导出多级表头表格
  • VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯
  • elasticsearch是如何实现master选举的?
  • 【Java】ArrayList和LinkedList的区别是什么
  • C语言的循环结构
  • 深入探索 Express.js 的高级特性
  • DevOps落地笔记-20|软件质量:决定系统成功的关键
  • 使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计
  • Unity AnimationRigging无法修改权重?
  • 【代理模式】
  • 【iOS ARKit】3D人体姿态估计实例
  • SpringCloud-Eureka原理分析
  • 2.0 Zookeeper 安装配置
  • WordPress如何实现随机显示一句话经典语录?怎么添加到评论框中?
  • Maven构建OSGI+HttpServer应用
  • 【Flask + AI】接入CHATGLM API 实现翻译接口
  • UML 2.5图形库
  • C++算法学习心得八.动态规划算法(1)
  • 前端性能优化:提升网站加载速度的终极指南
  • LeetCode回溯算法的解题思路
  • 使用 Matlab 拟合函数
  • 无广告iOS获取设备UDID 简单方便快捷
  • 常用ES技巧二