算法--盛最多水的容器

算法练习:盛最多水的容器 题目: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。 方法一:暴力破解,双层for循环遍历所有情况。 public class Solution { public int maxArea(int[] height) { int max = 0; ... 阅读详情

描述

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
在这里插入图片描述

示例

输入:[1,8,6,2,5,4,8,3,7]
输出:49

思路

算法流程: 设置双指针 ii,jj 分别位于容器壁两端,根据规则移动指针,并且更新面积最大值 res,直到 i == j 时返回 res。
指针移动规则与证明: 每次选定围成水槽两板高度 h[i],h[j] 中的短板,向中间收窄 1 格。以下证明:
设每一状态下水槽面积为 S(i,j),(0<=i<j<n),由于水槽的实际高度由两板中的短板决定,则可得面积公式 S(i,j)=min(h[i],h[j])×(j−i)。
在每一个状态下,无论长板或短板收窄 1 格,都会导致水槽 底边宽度 −1:
若向内移动短板,水槽的短板 min(h[i],h[j]) 可能变大,因此水槽面积 S(i, j) 可能增大。
若向内移动长板,水槽的短板 min(h[i], h[j])不变或变小,下个水槽的面积一定小于当前水槽面积。
因此,向内收窄短板可以获取面积最大值。换个角度理解:
若不指定移动规则,所有移动出现的S(i,j) 的状态数为C(n,2),即暴力枚举出所有状态。
在状态S(i,j) 下向内移动短板至S(i+1,j)(假设h[i]<h[j] ),则相当于消去了 {S(i, j - 1), S(i, j - 2), … , S(i, i + 1)}状态集合。而所有消去状态的面积一定 <= S(i, j):
短板高度:相比 S(i, j)相同或更短(<= h[i]);
底边宽度:相比 S(i, j)更短。
因此所有消去的状态的面积都 < S(i, j)。通俗的讲,我们每次向内移动短板,所有的消去状态都不会导致丢失面积最大值 。

实现

public int maxArea(int[] height) {
        int i = 0, j = height.length - 1, res = 0;
        while(i < j){
            res = height[i] < height[j] ?
                    Math.max(res, (j - i) * height[i++]):
                    Math.max(res, (j - i) * height[j--]);
        }
        return res;
    }

时间复杂度 O(N),双指针遍历一次底边宽度 N。
空间复杂度 O(1),指针使用常数额外空间。

参考:https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/

算法解密:盛最多水的容器问题全解析 通过对“盛最多水的容器”问题的暴力解法和双指针优化解法的详细讲解与代码实现,我们深刻体会到不同算法思路在解决问题时的差异。双指针法在降低时间复杂度方面展现出了巨大优势。在日常算法学习和实际应用中,我们要善于从简单解法出发,不断探索优化方案,提升代码的效率。希望这篇博客能助力大家在算法学习的道路上稳步前行,攻克更多有趣又富有挑战的算法难题。 阅读详情

相关推荐

双指针算法:盛最多水的容器详解

本文以“盛最多水的容器”问题为例,介绍了双指针算法的高效应用。首先分析暴力解法($O(n^2)$时间复杂度)的不足,然后详细阐述双指针解法:通过首尾指针向中间移动,每次移动较短边指针的策略,将时间复杂度优化至$O(n)$,空间复杂度保持$O(1)$。文章包含算法原理、Python代码实现和复杂度分析,展示了双指针在数组类问题中的优势,为处理类似问题提供了有效思路。

Hy_g_g_e_的博客 479

Leetcode算法系列| 11. 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。

游戏开发小Y的博客 3万+

【算法Hot100系列】盛最多水的容器

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

3种解法 - 计算盛最多水的容器

使用暴力法、从外向里、从里向外3种解法,得到盛最多水的容器...

具身小站 899

基于集成运放心电放大器设计(原创)

原创作者:einyboy or alert 最近在看美剧《危机边缘》关于边缘科学的案件,科技控可以看一下,但建议不在吃东西的时候看。想像力是创造的思想源头,动手能力则是创造的车床。 自认为是没有想像力的那类,只能发挥动手能力了。 心电测量简介 图1 心电极接线图 如图1心电测试一般使用3个心电极进行测量,各个电极的说明如下: RA: Right Arm缩写,右手电极 LA: L...

huandaohack的专栏 6923

restbed编译笔记

Restbed 可以构建出基于asio库的restfulAPI服务,Restbed 4.7版本使用了1.12.0版本的asio(其他版本编译不通过),可直接访问github下载:https://github.com/chriskohlhoff/asio/tree/asio-1-12-0。另外Restbed还依赖openssl库(可直接下载exe的安装包,安装后取出lib库及头文件放到到restbed\dependency\openssl中即可,https://slproweb.com/download/W.

mahong100的博客 2106

图解LeetCode11:盛最多水的容器(多种解法)

LeetCode11:盛最多水的容器 给你n个非负整数a1,a2,… … ,an,每个数代表坐标中的一个点(i, a)。在坐标内画n条垂直线,垂直线i的两个端点分别为(i, ai)和(i, 0)。找出其中的两条先,使得它们与x轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器 示例: 输入:[1,8,6,2,5,4,8,3,7] 输出:49 输入:[1,1] 输出:1 提示: n == height.length 2 <= n <= 10^5 0 <= height[i] &l

weixin_46429290的博客 2040

如何在 Windows 11 上安装 ChatGPT:CMD + 图形界面两种方式

我没说在 Windows 11 上装 ChatGPT 应用有多难,但你要是知道有哪几种官方途径可用,事情就会顺一点,尤其是对新手。对大多数用户来说,商店应用就是正确的选择。如果你在受管理的设备上,或者想避开商店,那么通过 Edge 或 Chrome 装 PWA 是完全站得住脚的替代方案。不管你选哪条路,真正的收获都是把 ChatGPT 从浏览器标签页里挪出来,放进一个它真正像个工具的地方。把它固定到任务栏、配好 Alt + 空格,你就会纳闷以前没它是怎么干活的。

山岚的运维笔记 290

Leetcode 11. 盛最多水的容器 (详细解析加JAVA代码)

首先明确一下容器容量的计算公式,这里简化为计算两条垂线和x轴围成的长方形面积。 根据短板效应:面积等于两条垂线中短的那一条 乘以 两条垂线的x轴距离。 即:S(i,j) = min(h[i],h[j]) × (j−i) (i,j分别为两条垂线的x轴坐标) 其次,我们要考虑怎么找到最大的面积? 肯定是通过移动指针选择不同的柱子来完成: 我们定义左右指针,初始分别指向最左边的柱子和最右边的柱子。每次移动的时候:都将高度低的柱子指针向内移动一格。直至两者相遇,比较所有面积,找到最大值。

qq_50438521的博客 1136

KV Cache 详解:新手也能理解的 LLM 推理加速技巧

(Autoregressive)生成的,即每次生成一个 token,然后将其作为输入继续生成下一个 token。:如果序列太长,超过了 KV Cache 的存储限制,就需要丢弃最早的 tokens(类似滑动窗口)。时,每次只会生成一个新 token,然后再把这个 token 作为输入继续生成下一个 token。,只缓存计算过的 K,VK, V,每次只计算新 token 的 K,VK, V,从而提升推理效率。:如果输入的 prompt 发生变化,之前的 KV Cache 不能复用,必须重新计算。

Harry的博客 7351

OpenClaw 安装失败:npm install 多次报错的完整排错与解决方案

这次问题的最终解决,其实并不复杂,但关键在于思路的转变:从“脚本怎么又失败了”,切换为“npm 在这一层到底失败在哪里”。当我们手动复现安装过程、打开 verbose 日志、直面真实错误栈时,问题就不再是模糊的“安装不了”,而是一个可以被定位、被验证、被修复的具体工程问题。

博客 1万+

算法 盛最多水的容器

本文将从基础概念出发,逐步深入探讨“盛最多水的容器”问题的不同解决方案,并通过具体的代码示例来展示如何实现这些算法。通过上述讨论,我们可以看到,“盛最多水的容器”问题不仅是算法技巧的体现,更是编程思维和工程实践相结合的结果。这里的“水”的量是由较短的那个线段决定的,因为水不会溢出。然而,在这个特定的问题中,由于每次决策都依赖于当前状态和下一个状态的关系,因此动态规划的应用并不直观。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1086

VTK 显示大量点云数据及交互(点云拾取、着色、测量等)功能

VTK (Visualization Toolkit) 是一个强大的开源可视化库,非常适合处理点云数据。下面将介绍如何使用 VTK 显示大量点云数据,并实现点云拾取、着色、测量等功能。

深之JohnChen的专栏 1994

【优选算法】双指针 -- 快乐数 和 盛最多水的容器

快乐数(medium) 编写⼀个算法来判断⼀个数 n 是不是快乐数。 盛最多水的容器 给定⼀个⻓度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的⽔。 返回容器可以储存的最⼤⽔量。 说明:你不能倾斜容器。

weixin_65186652的博客 3739

nvidia系列教程-AGX-Orin基础环境搭建

NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低功耗的边缘计算应用设计。无论是自动驾驶、机器人,还是智能监控系统,Jetson AGX Orin 都能为这些应用提供强大的计算能力。本篇博客将为大家详细介绍如何在AGX Orin(32GB)上搭建基础开发环境,包括系统安装、CUDA和cuDNN的配置等,帮助你快速上手这个强大的平台。架构: 搭载 56 个 Tensor Core 的 1792 核 NVIDIA Ampere c GPUCUDA Cores。

flypig has a dream! 2796

汽车IVI中控开发入门及进阶(47):CarPlay开发

车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。​驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,苹果推出了Apple CarPlay,这是一款汽车界面,允许驾驶员使用iPhone应用程序和其他IVI功能,如苹果地图、Siri、苹果音乐、iMessage,并拨打电话。

码农17年的博客 1129

【算法】双指针求解盛最多水的容器

对应 力扣11.盛最多水的容器,教你使用双指针来计算容器最多承载的水

做技术人 · 产优质博客 · 找好工作 1482

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

算法每日双题精讲——双指针(快乐数,盛最多水的容器)

本文聚焦于算法中的双指针技巧,通过 “快乐数” 和 “盛最多水的容器” 两道经典题目进行详细讲解。对于 “快乐数”,运用快慢指针判断数是否为快乐数,其关键在于通过计算数字各位平方和来追踪变化,直至出现特定条件判断结束。而 “盛最多水的容器” 则利用双指针从两端向中间移动,根据高度调整指针位置,计算容纳最多水的情况。双指针在这两道题中,通过合理的指针移动策略,有效降低时间复杂度,展示出处理数组相关问题的高效性与灵活性,为算法学习者提供了重要的解题思路和技巧借鉴。

A Charmer 的博客 3035

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[算法学习02]相向双指针之盛最多水的容器

这节是对相向双指针的进一步应用。

weixin_45066884的博客 1084

双指针算法-盛最多水的容器

本文介绍了双指针算法在解决盛水容器问题中的应用。通过双指针从数组两端出发,每次计算当前容器的水量(宽度×较小高度),并移动较矮的指针以寻找可能更大的水量。该算法将时间复杂度从暴力解法的O(n²)优化至O(n),核心在于每次移动较矮指针的贪心策略。文章详细解析了题目要求、算法原理和代码实现,特别强调了移动较矮指针的必要性,并通过示例直观演示了算法执行过程。这种双指针技巧能高效解决类似的最值问题。

2302_81265429的博客 987

算法题 盛最多水的容器

本文介绍了解决"盛最多水的容器"问题的双指针算法。给定一组垂线高度,通过初始化左右指针,计算当前容量并移动较小高度的指针,逐步寻找最大容量。算法时间复杂度O(n),空间复杂度O(1),比暴力法更高效。关键点在于每次移动较小高度指针以保留增大容量的可能性,确保不会错过最优解。文中提供了Java实现、详细注释、示例分析和测试用例,并解答了常见问题,证明该方法的正确性和高效性。

红血哥 557

算法双指针系列-Day3-盛最多水的容器

本题采用对撞指针解决,下面是对撞指针的简介对撞指针:一般用于顺序结构中,也称左右指针。• 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近。• 对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:◦ left == right (两个指针指向同一个位置)◦ left > right (两个指针错开)

m0_74189279的博客 1197

每天一道算法题之盛最多水的容器

本文介绍了解决"盛最多水的容器"问题的双指针算法。该问题要求在给定的高度数组中找出两条线,使其与x轴构成的容器能容纳最多的水。算法通过初始化左右指针,计算当前面积并更新最大值,然后移动较小高度的指针以寻求更大面积。这种方法的时间复杂度为O(n),空间复杂度为O(1)。代码实现简洁高效,适用于大规模数据。

qq_53579253的博客 719

【算法专题突破】双指针 - 盛最多水的容器(4)

11. 盛最多水的容器

Locky136的博客 1094

LeedCode算法题——盛最多水的容器

题目 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示...

ali_lili的博客 383
上一篇: 算法--排序数组中位数
下一篇: 算法--三数之和
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值