【leetcode】 盛最多水的容器
一、题目描述
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组
[1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
输入:height = [1,1] 输出:1
二、代码思路
分析题目,我们知道题目的意思是让我们求出两条棒子围出的最大面积,围出的面积是由短杆的高度乘与底边长得到的,也就是:
int area = (right - left) * Math.min(height[left], height[right]);
有两种解题方法
2.1 暴力题解
上面已经解释过了,目的是计算两条杠围成的最大面积,那么我们枚举出所有两条杠的组合即可。
2.2 双指针
上述的暴力题解,时间复杂度较高,题目要求n<10^5, on2的时间复杂度显然会超时的。所以想想优化的解法,题目中提到了左右两条杠组成的面积,所以我们可以考虑到双指针的解题思路。
但是问题的难点是双指针如何移动,我们考虑题目的要求,要求面积最大,面积是由左右杠高度以及左右杠之间的距离决定的,所以,移动规则如下:
- 如果left杠高度大于right杠那么移动right杠,也就是移动高度低的。
- 如果两条杠高度一致移动任意一个。
- 如果移动的时候发现相邻的杠高度比自身高度还低,那么不用计算其围成的面积。(因为底边长度度变少了,高度也变少了,那么面积必然也会变少)
那么如何证明我们移动的是正确的呢?
如果left杠高度大于right杠那么移动right杠,也就是移动高度低的。为什么移动高度低的? 计算面积的时候是由高度低的决定的面积,如果不移动它,那么面积会一直受到其限制,这样造成的结果就是底边越来越短,高度不变,或者高度变得更低。所以,移动高度高的我们的面积只会越来越短,从而做一些没必要的计算,只有移动高度低的才有可能出现面积更大的元素。
考虑第一步,假设当前左指针和右指针指向的数分别为 x 和 y,不失一般性,我们假设 x≤y。同时,两个指针之间的距离为 t。那么,它们组成的容器的容量为:
min(x,y)∗t=x∗t
我们可以断定,如果我们保持左指针的位置不变,那么无论右指针在哪里,这个容器的容量都不会超过 x∗tx * tx∗t 了。注意这里右指针只能向左移动,因为 我们考虑的是第一步,也就是 指针还指向数组的左右边界的时候。
详细题解:https://leetcode.cn/problems/container-with-most-water/solutions/207215/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/
三、代码题解
package leetcode.lc20221204;/** @author lzy* @version 1.0* @DESC 乘最多水的容器* */
class Solution01 {public static void main(String[] args) {}//思路1 :暴力解决//时间复杂度:o(n2) 2 <= n <= 10^5 会超时//空间复杂度:o1public int maxArea1(int[] height) {int res = 0;//边界值处理int length = height.length;if (length == 2) {return length * Math.min(height[0], height[1]);}//处理其他值,枚举出任意两根棒子组成的面积for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {int area = (j - i) * Math.min(height[i],height[j]);res = area > res ? area : res;}}return res;}//思路2:双指针问题public int maxArea(int[] height) {int res = 0;//边界值处理int length = height.length;if (length == 2) {return length * Math.min(height[0], height[1]);}int left = 0;int right = length - 1;while (left < right) {int area = (right - left) * Math.min(height[left], height[right]);res = area > res ? area : res;if (height[left] > height[right]) {right--;} else {left++;}}return res;}
}
【leetcode】 盛最多水的容器相关推荐
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- [贪心|双指针] leetcode 11 盛最多水的容器
[贪心|双指针] leetcode 11 盛最多水的容器 1.题目 题目链接 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 ...
- LeetCode.M11.盛最多水的容器
LeetCode.M11 题目: 题目大意: 如图所示. 数据范围: 如图所示 思路: 采用双指针,所容纳的水为min(h[l], h[r]) * (r - l) ,初始时l = 0,r = ...
- leetcode系列-11.盛最多水的容器
leetcode系列–第11题.盛最多水的容器 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) .找出其中的两 ...
- 算法leetcode|11. 盛最多水的容器(rust重拳出击)
文章目录 11. 盛最多水的容器: 样例 1: 样例 2: 提示: 原题传送门: 分析 题解 rust go c++ java typescript python 11. 盛最多水的容器: 给定一个长 ...
- 每日一道 LeetCode (51):盛最多水的容器
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 【LeetCode】1. 盛最多水的容器:C#三种解法
题目:https://leetcode-cn.com/problems/container-with-most-water/ 盛最多水的容器 难度:中等 给你 n 个非负整数 a1,a2,...,an ...
- LeetCode 11. 盛最多水的容器
11. 盛最多水的容器 思路:双指针,放弃低的那边 class Solution { public:int maxArea(vector<int>& height) {int n= ...
- 20200120:(leetcode)盛最多水的容器 两种解法
盛最多水的容器 题目 基本思路 代码实现 题目 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ...
- 算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)
文章目录 [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/) [15. 三数之和 ...
最新文章
- Java过滤特殊字符的正则表达式
- 学习笔记Hive(一)—— Hive简介
- 三菱st语言编程实例_LD、FBD、IL、ST、SFC、CFC六种编程语言的特点
- Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)
- 最新、最前沿AI论文哪里找?
- 关于OpenCV的那些事——相机姿态更新
- 十二月无书稿,总个结(2011)
- UVALive4983 UVa1593 POJ3959 Alignment of Code【字符串流+输入输出】
- python空行拼接字符串_在python中的每一个空行插入一个新的行字符串
- 力扣--8字符串转换整数 (atoi)
- 毕业了5年的同学突然告诉我,他已经是架构师了!
- 世界上第一部智能手机27岁了
- drupal与html转换,HTML转Drupal主题的方法
- 十六进制表示法(二进制/十六进制/十进制之间的转换)
- 主机内存测试软件,检测内存条的软件有哪些?内存条查看工具介绍
- 浅析游戏中的打击感如何实现
- 原生js实现运维小姐姐的九宫格抽奖活动、心跳快了
- 明日之后找回原来的服务器,明日之后怎么找回原来的账号
- Microsoft Platform SDK Febrary 2003下载(更新VC6的SDK)
- 各大券商提供的量化终端怎么样?