【算法学习】-【双指针】-【盛水最多的容器】

LeetCode原题链接:盛水最多的容器

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

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

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

说明:你不能倾斜容器。
示例1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49

示例1图:
在这里插入图片描述

解释:图中垂直线代表输入数组 [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、解题思路
求解本题当然也可暴力枚举,但本文主要通过这道题进行双指针算法的学习,故这里直接进行双指针算法的讲解。

虽说是双指针,但求解本题更重要的是对其单调性规律的发现和运用

首先,明确体积的计算为V = w * hw是数组中两个数据的距离h是这两数据中较小的一个木桶效应,也是解出本题的关键);

接下来关键点来了,此时 “固定” 较小的h,而将h较大的向内枚举,也就是让w减小;那么枚举的过程有且仅有以下两种情况
(1)w减小了h原来那个较小的h,此时据木桶效应仍以原来那个较小的h为计算体积的h;故此时计算V = w * hw减小,h不变,V一定减小
(2)w减小了h原来那个较小的h,此时据木桶效应以新的较小的h为计算体积的h;故此时计算V = w * hw减小,h减小,V一定减小

以上就前面所说的单调性规律,接下来的问题就是如何利用这个规律,通过双指针进行枚举解答

那么这里通过示例1 数组height [1,8,6,2,5,4,8,3,7] 进行说明:

这里的双指针更具体来说是对撞指针,所以让一个指针指向数组的第一个数据(设指针为front,下标为0),另一个指针指向最后一个数据(设指针为back,下标为7)开始枚举
(1)初始时,可得宽度为w = back - fronth取较小者,也就是height[front];将它们相乘得到一个体积值V1;根据单调性,下一步若将back向前(向内)移进行枚举,直至第一个数据,算出来的体积一定都小于V1,(w一直在减小,h要么不变要么更小),故此时不应让back向前,而应让front向后(向内)移动进行枚举

虽然front向后宽度也一定是减小的,h有可能变大,且变大的幅度远超w减小的幅度而让总体积增大

此时我们就可以得到两个指针移动的规律了:让高度小的指针向内移动枚举,即若front对应在数组中的数据大于等于back在数组中的数据,即height[front] >= height[back] ,就让back--;反之,则让front++

(2)通过上面的分析,下一步是front++,++后我们计算出第二个体积V2;然后重复上述过程,每一步都能算出一个体积,最后这些体积中最大的即为问题的解。

2、具体代码

int maxArea(vector<int>& height) {int front = 0;int back = height.size() - 1;int resArea = 0;while(front != back){int area = (back - front) * (height[front] < height[back] ? height[front] : height[back]);if(area > resArea){resArea = area;}if(height[front] < height[back]){front++;}else{back--;            }}return resArea;}

看完觉得有觉得帮助的话不妨点赞收藏鼓励一下,有疑问或看不懂的地方或有可优化的部分还恳请朋友们留个评论,多多指点,谢谢朋友们!🌹🌹🌹

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矢量图形编辑软件illustrator 2023 mac特点介绍

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软件&am…

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享&#xff0c;和SMS短信方式分享链接内容&#xff0c;该怎么做呢&#xff1f;图示如下: 分享到国外各大社交平台&am…

如何禁用Windows 10快速启动(以及为什么要这样做)

如果您不想启用Windows 10快速启动&#xff0c;则可以相对轻松地禁用它。 快速启动是一项功能&#xff0c;首先在 Windows 8 中作为快速启动实现&#xff0c;并延续到 Windows 10&#xff0c;让您的 PC 更快地启动&#xff0c;因此得名。虽然这个方便的功能可以通过将操作系统…

Linux——指令初识

Linux下基本指令 前言一、 ls 指令二、 pwd命令三、cd 指令四、 touch指令五、mkdir指令六、rmdir指令 && rm 指令七、man指令八、cp指令九、mv指令十、cat指令十一、.more指令十二、less指令十三、head指令十四、tail指令总结 前言 linux的学习开始啦&#xff01; 今…

数字世界中的定位专家,手机号码归属地数据源下载!

随着数字化的发展&#xff0c;各种数据的应用场景越来越多&#xff0c;而其中定位技术在这个过程中扮演着越来越重要的角色。在数字世界中&#xff0c;定位专家的重要任务之一就是给出用户在数字世界中的位置。其中&#xff0c;手机号码归属地数据源是定位专家的一个重要数据源…

手机或者电脑连接局域网内的虚拟机(网桥)

手机或者电脑连接局域网内的虚拟机&#xff08;网桥&#xff09; 手机软件&#xff1a;ConnectBot&#xff0c;Termius&#xff0c;JuiceSSH … 1.虚拟机vmware中添加桥接网卡 这里桥接网卡选择的是自动&#xff0c;是自动生成动态IP&#xff0c;如果不需要动态生成&#xff…

systemverilog function的一点小case

关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用&#xff0c;但是一直有一个模糊的概念困扰着我&#xff0c;今天刚好有时间来搞清楚并记录下来。 关于fucntion的返回值的问题&#xff1a; function integer clog2( input logic[255:0] value);for(cl…

使用Jest测试Cesium源码

使用Jest测试Cesium源码 介绍环境Cesium安装Jest安装Jest模块包安装babel安装Jest的VSC插件 测试例子小结 介绍 在使用Cesium时&#xff0c;我们常常需要编写自己的业务代码&#xff0c;其中需要引用Cesium的源码&#xff0c;这样方便调试。此外&#xff0c;目前代码中直接使用…

ubuntu中的系统消息中显卡显示llvmpipe (LLVM 10.0.0, 256 bits)

这是我在使用ubuntu系统时出现的问题&#xff0c;网上搜到很多解决的办法&#xff0c;我是一顿操作&#xff0c;后来看到这位老哥的帖子解决了。 集Linux / Ubuntuwin10双系统安装记录(2):AMD核显驱动引发的问题 - 知乎上一篇中我们提到了 astroR2&#xff1a;Linux / Ubuntuw…

DataFrame入门

文章目录 1. 数据集合加载2. 使用常用的属性/方法查看数据情况type()shapecolumnsdtypesinfo() 3. 查看部分数据获取一列数据获取多列数据按行加载数据同时取出行列数据切片语法 4. 简单数据分析5. 数据可视化总结 1. 数据集合加载 pd.read_csv()方法不仅可以加载CSV文件&…

初识Java 12-3 流

目录 终结操作 将流转换为一个数组&#xff08;toArray&#xff09; 在每个流元素上应用某个终结操作&#xff08;forEach&#xff09; 收集操作&#xff08;collect&#xff09; 组合所有的流元素&#xff08;reduce&#xff09; 匹配&#xff08;*Match&#xff09; 选…

LLM下半场之Agent基础能力概述:Profile、Memory、Plan、Action、Eval学习笔记

一.Agent发展将会是LLM的下半场 目前大家都在讨论LLM&#xff0c;LLM解决的问题是帮助机器像人类一样理解彼此的意图&#xff0c;本质上来讲&#xff0c;LLM更像是一个技术或者工具。但是人类社会发生变革的引线&#xff0c;往往是一个产品或者解决方案&#xff0c;比如电池技…

jQuery中ajax的使用

$ .ajax()方法概述 在jQuery中也为大家封装好了一些ajax方法。内部会自动将data对象转换成x-www-form-urlencoded的形式&#xff0c;data中我们也可以传递字符串。如果要传递json格式数据&#xff0c;需要设置contentType和将data写成json字符串的形式&#xff08;可以用JSON.s…

C/C++ 动态规划面试算法题

1.买卖股票的最佳时机 https://blog.csdn.net/qq_41277628/article/details/113322136 输入&#xff1a;[7,1,5,3,6,4] 输出&#xff1a;5 解释&#xff1a;在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&#xff…

Linux【网络】数据链路层

Linux【网络】数据链路层 数据链路层以太网帧格式对比理解MAC地址和IP地址ARP协议--地址解析协议ARP工作流程ARP请求ARP应答 其他协议DNS-域名解析协议ICMP--网络层协议NAT技术NAPT 正向代理与反向代理 数据链路层 数据链路层用于两个设备&#xff0c;同一数据链路节点之间的信…

栈和队列的实现

用栈实现队列 1.分析2.代码 1.分析 2.代码 class MyQueue {private Stack<Integer> s1;private Stack<Integer> s2;public MyQueue() {s1 new Stack<>();s2 new Stack<>();}public void push(int x) {s1.push(x);}public int pop() {if(empty()){re…

多线程安全的Queue

在实际工作中经常会用到生产者消费者模式,这时候使用queue即可解决问题,但每次使用都需要自己动手加锁,通知,于是便自己封装了一个多线程安全的队列,代码如下: SafeQueue.h: #pragma once #include <queue> #include <mutex> #include <condition_variab…

基础算法:习题

786.第k个数 #include <iostream>using namespace std;const int N 100010;int q[N];int quick_sort(int q[], int l, int r, int k) {if (l > r) return q[l];int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i ; while (q[i] < x);do j --…

山西电力市场日前价格预测【2023-10-05】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-05&#xff09;山西电力市场全天平均日前电价为363.87元/MWh。其中&#xff0c;最高日前电价为649.89元/MWh&#xff0c;预计出现在18: 45。最低日前电价为291.58元/MWh&#xff0c;预计…

微信公众号模板消息First,Remark字段不显示,备注字段不见了

今天在开发公众号过程中有个需求发模板消息我设置的如下 成绩单打印通知&#xff01;姓名&#xff1a;{{name.DATA}} 学号&#xff1a;{{stuid.DATA}}状态&#xff1a;{{status.DATA}}时间&#xff1a;{{date.DATA}} 备注&#xff1a;{{remark.DATA}} 然后发完通知发现《…