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

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

文章目录

  • 题目介绍
  • 思路分析
    • 暴力枚举(超时)
    • 优化:左右指针
  • 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;
    }

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

相关文章:

  • 洛谷P4376 [USACO18OPEN] Milking Order G
  • 垃圾收集算法
  • R语言的移动应用开发
  • JavaWeb全链路学习:8、数据库-sql语句
  • 【免费】1949-2020年各省人均GDP数据
  • C++基础 [三] - 面向对象三
  • 基于SpringBoot实现旅游酒店平台功能十六
  • 【实用技巧】如何优雅的批量保存网页快照?
  • 每日复盘20250314
  • 零基础上手Python数据分析 (5):Python文件操作 - 轻松读写,数据导入导出不再是难题
  • 零基础上手Python数据分析 (3):Python核心语法快速入门 (下) - 程序流程控制、函数与模块
  • 嵌入式八股,为什么单片机中不使用malloc函数
  • 基于Asp.net的物流配送管理系统
  • CockroachDB MCP -cursor适用
  • 基于NXP+FPGA轨道交通3U机箱结构逻辑控制单元(LCU)
  • 虚拟机docker连接mysql的ip地址在哪里查看?
  • C 语言实战:打造字符串加密器及实验要点解析
  • 2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题C卷
  • 使用 Redis 实现接口缓存:提升性能的完整指南
  • 第5章 构造、析构、拷贝语义学3:对象复制语意学