【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目

11. 盛最多水的容器

给定一个长度为 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

2.解法⼀(暴⼒求解)(会超时):

时间复杂度:O(n^2)

算法思路:
枚举出能构成的所有容器,找出其中容积最⼤的值。
◦ 容器容积的计算⽅式:
设两指针i, j 分别指向⽔槽板的最左端以及最右端,此时容器的宽度为j - i 。由于
容器的⾼度由两板中的短板决定,因此可得容积公式:

v = (j - i) * min(height[i], height[j])

 

class Solution {
public:int maxArea(vector<int>& height) {int n = height.size();int ret = 0;// 两层 for 枚举出所有可能出现的情况for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {// 计算容积,找出最⼤的那⼀个ret = max(ret, min(height[i], height[j]) * (j - i));}}return ret;}
};

3.解法⼆(对撞指针):

算法思路:
设两个指针 left , right 分别指向容器的左右两个端点,此时容器的容积:
v = (right - left) * min( height[right], height[left])
容器的左边界为height[left] ,右边界为height[right] 。
为了⽅便叙述,我们假设「左边边界」⼩于「右边边界」
如果此时我们固定⼀个边界,改变另⼀个边界,⽔的容积会有如下变化形式:

◦ 由于左边界较⼩,决定了⽔的⾼度。如果改变左边界,新的⽔⾯⾼度不确定,但是⼀定不会超过右边的柱⼦⾼度,因此容器的容积可能会增⼤。


◦ 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。


由此可⻅,左边界和其余边界的组合情况都可以舍去。所以我们可以 left++ 跳过这个边界,继续去判断下⼀个左右边界。


当我们不断重复上述过程,每次都可以舍去⼤量不必要的枚举过程,直到 left 与right 相
遇。期间产⽣的所有的容积⾥⾯的最⼤值,就是最终答案。 

 

 

 

 直到 left 与right 相遇

 4.代码实现

1.C语言


int min(int a, int b) {if (a < b) {return a;} else {return b;}
}
int max(int num1, int num2) {return (num1 > num2 ) ? num1 : num2;
}
int maxArea(int* height, int heightSize){int left = 0, right = heightSize- 1, ret = 0;while (left < right) {int v = min(height[left], height[right]) * (right - left);ret = max(ret, v);// 移动指针if (height[left] < height[right])left++;elseright--;}return ret;
}

2.C++

class Solution {
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1, ret = 0;while (left < right) {int v = min(height[left], height[right]) * (right - left);ret = max(ret, v);// 移动指针if (height[left] < height[right])left++;elseright--;}return ret;}
};

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

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

相关文章

探索MySQL数学宝库:常用数学函数的秘密操作

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探索MySQL数学宝库&#xff1a;常用数学函数的秘密操作 前言ABS函数&#xff08;绝对值&#xff09;ROUND函数&#xff08;四舍五入&#xff09;CEIL和FLOOR函数&#xff08;向上取整和向下取整&#…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代&#xff0c;个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI&#xff0c;为消费者提供了精彩的内容推荐服务&#xff0c;更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好&#xff0c;能够快速识别其兴趣…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…

Spring Cloud原理的深入解读

Spring Cloud原理的深入解读 Spring Cloud&#xff0c;作为Spring家族中的微服务框架&#xff0c;近年来在业界得到了广泛的应用和认可。其背后所依赖的核心原理和技术支撑&#xff0c;为我们提供了强大的微服务治理能力和开发便利性。本文将深入解析Spring Cloud的核心原理&a…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

透明桌面便签便笺怎么设置 透明的便签在哪

在繁忙的工作与生活中&#xff0c;我一直渴望找到一种能够轻松管理待办事项的方式。最近&#xff0c;我发现了一个让我爱不释手的工具。它不仅有着出色的提醒功能&#xff0c;更独特的是&#xff0c;它提供了透明便签的设计。 那么&#xff0c;透明便签的好处究竟有哪些呢&…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

c++使用mysqlclient库开发mysql

使用libmysqlclient库对mysql进行c开发 安装 sudo apt update && sudo apt install libmysqlclient-dev -y封装客户端 一般都是封装一个客户端类进行开发&#xff0c;如下的mysql.hpp&#xff1a; #pragma once #include <mysql/mysql.h> #include <strin…

EPSON推出可定制晶振技术支持

什么叫做定制晶振呢?定制晶振又可以称为订制&#xff0c;订做晶振&#xff0c;爱普生可编程晶振可在0.67MHz~166MHz频率范围内实现任意频率烧录订制。定制频率晶振是基于PLL技术的一次频率烧录的振荡器&#xff0c;在没有温补的情况下也能够产生稳定的频率输出。单CMOS频率输出…

什么才是正确的领域驱动实现架构?

作为一种系统建模方法&#xff0c;DDD同样涉及系统的体系架构设计。区别于分布式、事件驱动、消息总线等架构设计方法&#xff0c;DDD中的架构设计关注前面各章所介绍的聚合、实体、值对象、领域事件、应用服务以及资源库之间的交互方式和风格&#xff0c;并在设计思想上有其独…

基于Go编写一个人员管理系统案例

代码结构 人员结构体 package entity// 结构体&#xff1a;人 type Person struct {Id intName stringSex stringAge int }// 构造函数 func NewPerson(id int, name, sex string, age int) *Person {return &Person{Id: id,Name: name,Sex: sex,Age: age,} }人员…

【AutoGPT】踩坑帖(follow李鱼皮)

本文写于2024年5月7日 参考视频&#xff1a;AutoGPT傻瓜式使用教程真实体验&#xff01; 对应文章&#xff1a;炸裂的AutoGPT&#xff0c;帮我做了个网站&#xff01; 平台&#xff1a;GitPod 云托管服务 原仓库已经改动很大&#xff0c;应使用的Repo为&#xff1a;Auto-GPT-ZH…

服务器拒绝登陆:Permission denied (publickey,password)

在账号密码正确的情况下&#xff0c;登陆服务器出现Permission denied (publickey,password)错误。 主要原因是shell软件&#xff08;比如zsh软件&#xff09;卸载后&#xff0c;主机的默认shell配置未改成可使用的shell软件&#xff08;比如系统默认的bash&#xff09; 通过…

人工智能将改变科研?从胰腺癌早筛到新药研发

去年底英国《自然》杂志刊文预测的2024年十大科学进展中&#xff0c;人工智能的进步和ChatGPT人工智能占据前两位。那么&#xff0c;人工智能对于科学而言&#xff0c;它的哪些成果将带来有益的发展&#xff1f;今天我们请知名科普作者张田勘来聊聊这个话题。 &#xff08;1&am…

互联网巨头新战场:百度高管抖音首秀背后的营销变革与争议浪潮

在这个流量为王的时代&#xff0c;每一次跨界尝试都可能成为行业瞩目的焦点。5月7日&#xff0c;中国互联网巨头百度的公关副总裁璩静&#xff0c;以其独特的姿态&#xff0c;踏入了短视频的风口浪尖——抖音平台。这一看似寻常的举动&#xff0c;实则在业界激起了千层浪&#…

C语言 | Leetcode C语言题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; char* minWindow(char* s, char* t) {int tLen strlen(t);int hash[256] { 0 };for (int i 0; i < tLen; i)hash[t[i]];for (int i 0; i < 256; i) {if (0 hash[i])hash[i] INT_MIN;}int left, right, count, start, minLen, s…

VBA 创建透视表,录制宏,自动化报表

目录 一. 数据准备二. 需求三. 准备好报表模板四. 执行统计操作&#xff0c;录制宏4.1 根据数据源创建透视表4.2 填充数据到报表4.3 结束宏录制 五. 执行录制好的宏&#xff0c;自动化报表 一. 数据准备 ⏹数据源1 姓名学科成绩丁志敏语文91李平平语文81王刚语文64张伊语文50…

【C++数据结构】string的模拟实现

为了更好的使用C中的标准库&#xff0c;下面是对string一些比较重要的接口进行模拟实现&#xff0c;有需要借鉴即可。 这里给出string文档地址链接&#xff0c;方便对照&#xff1a;LINK 目录 1.string结构的设计2.string构造函数2.1构造函数分开写2.2构造函数一块写2.3拷贝构造…

再学Java基础——HashMap和Hashtable

HashMap和Hashtable在Java中都是用于存储键值对的数据结构&#xff0c;但它们之间存在一些重要的区别。以下是它们之间的主要差异&#xff1a; 线程安全性&#xff1a; Hashtable是线程安全的&#xff0c;它的每个方法&#xff08;如put和get&#xff09;都是同步的&#xff0…