专题1 - 双指针 - leetcode 11. 盛最多水的容器

leetcode 11. 盛最多水的容器

  • 1. leetcode 11. 盛最多水的容器
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

1. leetcode 11. 盛最多水的容器

1. 题目详情

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。
在这里插入图片描述

示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:
输入:height = [1,1]
输出:1

提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104

1. 原题链接

leetcode 11. 盛最多水的容器

2. 基础框架

● Cpp代码框架

class Solution {
public:
    int maxArea(vector<int>& height) {

    }
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 题目要求的是水池的最大容积

2. 算法原理

( 1 ) (1) (1) 首先会想到使用暴力解法,使用两层for循环枚举出所有的情况,找出最大水的容积。但是时间复杂度 O ( n 2 ) O(n^2) O(n2)题目不给过,需要找规律优化效率。

( 2 ) (2) (2) 使用对撞双指针算法:指针left指向数组第一个元素,指针right指向数组最后一个元素;此时容积可表示为 v = ( r i g h t − l e f t ) ∗ m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) v=(right - left) * min(height[left], height[right]) v=(rightleft)min(height[left],height[right])
( 3 ) (3) (3) 假设初始时 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left] < height[right] height[left]<height[right]:我们们的目的是找出水的最大容积 v v v。首先不管是 l e f t left left往左移动,还是 r i g h t right right往右移动, ( r i g h t − l e f t ) (right - left) (rightleft)一定是减小的;
当前 h e i g h t height height较小的是 h e i g h t [ l e f t ] height[left] height[left],那么如何确定是 l e f t left left向右移动还是 r i g h t right right向左移动呢?

( 4 ) (4) (4) 假设是 l e f t left left向右移动(right不变):对于移动后的最小 h e i g h t height height就有两种情况:
1.left移动后的 h e i g h t height height<=原先的 h e i g h t height height,此时 m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) min(height[left],height[right]) min(height[left],height[right])是不变或减小的,那么 v v v一定是减小的;
2.left移动后height>原先的 h e i g h t height height,此时 m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) min(height[left], height[right]) min(height[left],height[right])是增大的(增大之后也不会超过 h e i g h t [ r i g h t ] height[right] height[right],因为是选择较小的 h e i g h t height height计算),那么 v v v就可能是增大的。

( 5 ) (5) (5) 假设是 r i g h t right right向左移动(left不变):移动之后 h e i g h t [ r i g h t ] height[right] height[right]不管是增大、不变、还是减小, m i n ( h e i g h t [ l e f t , h e i g h t [ r i g h t ] ) min(height[left,height[right]) min(height[left,height[right])的值均不超过移动之前的值,即 v v v一定是减小的。

( 6 ) (6) (6) 综上,移动 h e i g h t height height较大的一方时, v v v不会超过当前的值;移动 h e i g h t height height较小的一方才可能得到更大的 v v v

3. 时间复杂度

O ( n ) O(n) O(n)

左右双指针 l e f t left left r i g h t right right对撞而走,直到相遇结束,最终共同遍历了一遍整个数组。

3. 代码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
        // v = s * h
        int l = 0, r = height.size() - 1;
        int maxWater = 0;
        while(l < r){
            int v = (r - l) * min(height[l], height[r]);
            maxWater = max(maxWater, v);
            if(height[l] > height[r]){
                r--;
            }
            else{
                l++;
            }
        }
        return maxWater;
    }
};

4. 知识与收获

( 1 ) (1) (1) 双指针是非常优秀的一种算法,常常使算法时间复杂度降低一维。
( 2 ) (2) (2) 常使用的有两种形式:
对撞双指针,常见于数组中,核心思想来自快排。左指针left指向起始元素,右指针right指向最后一个元素。在循环中判断某些条件让左指针left向右移动,右指针right向左移动,直到leftright相遇停下来。
快慢双指针,又叫龟兔赛跑法,常见于数组、链表中,典例就是判断链表是否有环。定义快慢指针slowfast,通过让快慢指针分别以不同的速度移动来达到我们的目的。一般是快指针fast一次走多步,慢指针slow一次走一步。
( 3 ) (3) (3) 双指针算法是一种思想,不局限于数组或链表。双指针不一定非要是定义两个指针,也可以是下标。


T h e The The E n d End End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445144.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考攻略/软考详解/软考等级/软考科目

目录 前言 一、软考是什么 二、证书样式 三、软考介绍 3.1 什么是软考? 3.2 通过了软考&#xff0c;就算有职称了么? 3.3 哪些人可以参加软考? 3.4 软考设置了哪些资格? 3.5 哪些资格含金量比较高呢?报考建议? 四、中级资格推荐以下几个: 计算机软件类 --软件…

【AI视野·今日NLP 自然语言处理论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 5 Mar 2024 (showing first 100 of 175 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Key-Point-Driven Data Synthesis with its Enhancement on Mathematica…

农场管理小程序|基于微信小程序的农场管理系统设计与实现(源码+数据库+文档)

农场管理小程序目录 目录 基于微信小程序的农场管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、农场信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&#x…

Day22:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

目录 开发环境 数据导入-mysql架构&库表列 数据库操作-mysqli函数&增删改查 数据接收输出-html混编&超全局变量 第三方插件引用-js传参&函数对象调用 完整源码 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0…

Stable Diffusion 模型下载:ZavyChromaXL(现实、魔幻)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述&#xff1a;该模型系列应该是用于 SDXL 的 ZavyMix SD1.5 模型的延续。主要重点是获…

【工具】Git的24种常用命令

相关链接 传送门&#xff1a;>>>【工具】Git的介绍与安装<< 1.Git配置邮箱和用户 第一次使用Git软件&#xff0c;需要告诉Git软件你的名称和邮箱&#xff0c;否则无法将文件纳入到版本库中进行版本管理。 原因&#xff1a;多人协作时&#xff0c;不同的用户可…

M1电脑 Xcode15升级遇到的问题

遇到四个问题 一、模拟器下载经常报错。 二、Xcode15报错: SDK does not contain libarclite 三、报错coreAudioTypes not found 四、xcode模拟器运行一次下次必定死机 一、模拟器下载经常报错。 可以https://developer.apple.com/download/all/?qios 下载最新的模拟器&…

Skywalking

1、简介 Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c; 2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c; 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c; 目前SkyWalking支持Java、 .Net、 …

lvs集群中NAT模式

群集的含义 由多台主机构成&#xff0c;但对外表现为一个整体&#xff0c;只提供一个访问入口&#xff0c;相当于一台大型的计算机。 横向发展:放更多的服务器&#xff0c;有调度分配的问题。 垂直发展&#xff1a;升级单机的硬件设备&#xff0c;提高单个服务器自身功能。 …

复盘-PPT

调整PPT编号起始页码在设计→幻灯片大小 设置所有以及文本项目符号 ## 打开母版&#xff0c;找到对应级别设置重置 当自动生成的smartart图形不符合预期时

Python Web应用程序构建的最佳实践:代码实例与深度解析【第122篇—装饰器详解】

Python Web应用程序构建的最佳实践&#xff1a;代码实例与深度解析 在当今数字时代&#xff0c;构建高效、可扩展的Web应用程序是开发者们的一项重要任务。Python&#xff0c;作为一种简洁、强大的编程语言&#xff0c;为Web开发提供了丰富的工具和框架。在本篇文章中&#xff…

递增三元组 刷题笔记

题意为 若存在 a中的数小于b中的数&#xff0c;b中的数小于c中的数 则该数算一种方案 思路 暴力模拟优化 两层循环遍历即可 从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可 那么第一层和第三层是对称的 我们有没有可能再去掉一层循环 只做一次遍历 …

使用51单片机控制lcd1602字体显示

部分效果图&#xff1a; 准备工作&#xff1a; 51单片机&#xff08;BST&#xff09;1602显示屏 基础知识&#xff1a; 注&#xff1a;X表示可以是0&#xff0c;也可以是1&#xff1b; DL 1&#xff0c; N 1&#xff0c; F 0&#xff0c; 代码一&#xff1a; 要求显示字母…

NIN网络中的网络

是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深&#xff08;加宽指增加通道数&#xff0c;那加深呢&#xff1f;&#xff08;层数增加叭 Ni…

【STM32】HAL库 CubeMX 教程 --- 通用定时器 TIM2 定时

实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM2&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。…

ClickHouse Grafana插件4.0版 - 升级SQL可观测性

本文字数&#xff1a;3396&#xff1b;估计阅读时间&#xff1a;9 分钟 作者&#xff1a;Clickhouse team 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 自2022年5月Grafana的ClickHouse插件首次发布以来&#xff0c;两种技术都有了…

AOP的常见使用方法

面向切面编程&#xff08;AOP&#xff0c;Aspect-Oriented Programming&#xff09; 面向切面编程是一种软件设计和编程范式&#xff0c;它旨在解决在传统面向对象编程&#xff08;OOP&#xff09;中难以模块化处理的“横切关注点”问题。横切关注点是指那些跨越多个对象、类或…

每日OJ题_牛客HJ74 参数解析(IO型OJ)

目录 牛客HJ74 参数解析 解析代码1 解析代码2 牛客HJ74 参数解析 参数解析_牛客题霸_牛客网 解析代码1 #include <iostream> #include <string> #include <vector> using namespace std; int main() {string str "";getline(cin, str);vecto…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能&#xff0c;可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…