11.盛水最多的容器
作者 : XiaXinyu
日期 :2021-10-01
题目
理解
这道题的关键点在于要理解木桶效应,即一个木桶能装多少水取决于最短的木板长度
题解一(双指针)
经过思考可以得出两个解题的关键点
- 1.相同情况下,左右边界的距离越远越好
- 2.面积受限于左右边界中较短边界
下面对关键点1进行证明
证明关键点1:
因为计算容量的公式为area = (min(al,ar) * (r - l))即左右边界中的较短边乘以左右边界的距离
所以当al = ar 的时候r 和 l之间的距离越大所计算出的面积越大
证毕
根据两个关键点可以得出这道题的思路,初始化两个指针分别指向数组的左右两端
重点在于采用哪种策略移动指针
应该移动数字较小的指针还是数字较大的指针呢?
答案是较小的,下面来证明这种做法是正确的
证明:
首先令初始状态左右指针指向的数分别x,y,假设x <= y,左右指针之间的距离为t
那么它们组成容器的容量为 area = min(x,y) * t = x * t
先看看移动右指针(指向数字较大的指针
)的情况,因为右指针一定会向左移动到某个位置,所以t一定减小,假设移动后右指针指向的数为y1,左右指针边界为t1,则此时的y1有两种情况
1.y1 <= y 则 min(x,y1) <= min(x,y)
2.y1 > y 则min(x,y1) = min(x,y) = x
综上:min(x,y1) <= min(x,y) = x,而t1 < t所以无论右指针向左移动到哪个位置,容器的容量area = min(x,y1) * t1一定会减小,所以我们只能移动左指针即指向数字较小的指针来得到更大的容量
证毕
还有一种特殊情况就是左右指针指向的数字相等时应该移动哪个指针,其实这种情况移动哪个指针都是一样的,仍然有两种情况需要讨论一下
1.如果左右指针之间的数字只有一个或者没有大于左右指针指向的数字,那么无论移动哪个指针答案都是左右指针当前指向的数字所计算出的容量,所以移动谁都一样
2.如果左右指针之间的数字有两个或者以上大于左右指针指向的数字,此时下图中1号和8号之间有两个更大的数字,假设先移动左指针,那么1号会变成4号,在这个过程中一定不会产生更大的容量,因为2,3号数字都小于7号,然后右指针会变为6号,因为在移动过程中的数字都不会大于1号和8号,所以先移动谁是一样的。
代码
public class Solution{public int maxArea(int[] height){int l = 0, r = height.length - 1;int ans = 0;while(l < r){ans = Math.max(Math.min(height[l],height[r]) * (r - l), ans);if(height[l] <= height[r])l ++;elser --;}return ans;}
}
时间复杂度
:O(n) n为数组的长度
空间复杂度
:O(1)
11.盛水最多的容器相关推荐
- LeetCode 11盛水最多的容器12整数转罗马数字
目录 盛水最多的容器 题目描述 分析 整数转罗马数字 题目描述: 分析 结语 盛水最多的容器 公众号:bigsai,回复进群加入打卡,回复bigsai获取3GB的pdf资源.点赞再看,养成习惯! 题目 ...
- 力扣:11盛水最多的容器
class Solution:def maxArea(self, height: List[int]) -> int:i, j, res = 0, len(height) - 1, 0while ...
- Leetcode题库 11.盛水最多的容器(双指针法 C实现)
文章目录 解析 思路 原理 代码 写法1 写法2 解析 p_0:左"指针" p_1:右"指针" Area:当前双"指针"代表面积大小 ret ...
- Leecode刷题热题HOT100(11)——盛水最多的容器
- LeetCode 11盛水最多的容器
力扣 解释:给定数组nums,求Max( min(nums[i],nums[j])*(j-i) ), 0<=i<j<nums.size() 目录 双指针 简单证明: 小技巧 1.对撞 ...
- 力扣--盛水最多的容器
题目: 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条 ...
- Container with most water(盛水最多的容器)
Container with most water(盛水最多的容器) 简单的证明 如图 题目: 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n ...
- Leetcode:11.container-with-most-water(盛水最多的容器)
一开始直接想用暴力法加剪枝擦边通过的,没想到还是超时了: 谁知道最后输入从1-15000一共15000个数据,吓坏! 题解中得知双指针实现O(n),真的学到了,羡慕这些大佬的智商: 借鉴大佬题解:对O ...
- 十一、盛水最多的容器
题目:来源于LeetCode 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) . 找出其中的两条线,使得它们与 ...
- leecode11 盛水最多的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
最新文章
- python菜鸟工具-第一行Python代码之菜鸟逃离记
- 初次使用Android Studio问题,Android Studio往项目中添加图片
- python request下载-Python使用requests下载文件问题
- C++学习之路 | PTA乙级—— 1052 卖个萌 (20 分)(精简)
- java解析vue对象数组,Java数组
- RGB想YCbCr空间的变换
- 最大熵模的理解与最大熵模型逻辑回归相似转换条件
- 数论入门符号_大o符号快速入门
- 红帽linux中文系统下载iso,红帽子9.0版下载-redhat linux 9.0 iso下载 简体中文正式版-IT猫扑网...
- c/c++ utf-8与gbk的互相转化
- 什么是网络爬虫?有哪些作用?如何构建?
- 引用网页链接的BibTEX格式
- 《阿里云服务器教程2》:如何远程连接linux系统阿里云服务器ECS
- Unity之使物体透明化和还原
- LSM303DLH六轴角度传感器驱动
- 22.Odoo产品分析 (三) – 人力资源板块(3) – 休假管理(1)
- 为什么.bat脚本不断重复执行同一命令
- EAI技术和概念解析
- echarts 多种类型的legend一行居中展示
- ssm java编程遇到从数据库中查询的时间与存储时间不一致