LeetCode 11 - 盛最多水的容器 - [双指针暴力]
题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/
给定 n 个非负整数 $a_1,a_2,\cdots,a_{n-1},a_n$,每个数代表坐标中的一个点 $(i, a_i)$。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 $(i, ai_)$ 和 $(i, 0)$。
找出其中的两条线,使得它们与 $x$ 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 $n$ 的值至少为 2。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
(引用来自官网上的)题解:
这种方法背后的思路在于,两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大;
我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾;
此外,我们会使用变量 maxarea 来持续存储到目前为止所获得的最大面积;
在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较长线段那端移动一步。
说实话,其实算法过程非常简单,实现起来也就个位数行的代码,但是,怎么证明这样的算法是正确的呢?
证明(以下参考https://segmentfault.com/a/1190000016654619):
假设最优解的容器的两个边界在位置 $L$ 和 $R$,高度为 $h(L)$ 和 $h(R)$,那么根据算法,由于每次左右指针中只有一个能移动一步,那么必然有一个先到达两个边界中的一个,
不妨假设是左指针先走到 $L$,即 $l=L$;那么此时右指针必然还没有走到 $R$,即 $r > R$;
那么,只要证明如下假设:接下来的每一步都只能是右指针左移一格,左指针始终不能动。就意味着我们的算法在枚举过程中,必然会在某一步走到最优解,从而使得算法得到的答案正确;
采用反证法:
若上述假设不成立,则意味着如下假设成立:必然存在某一步,是左指针右移一格,而右指针没有动;
则根据以上描述可知,在这一步的时候:$l=L<R<r$ 且 $h(l) = h(L) < h(r)$,由此可知此时边界为 $l$ 和 $r$ 的容器的容量 $S$ 为
$S = h\left( l \right) \times \left( {r - l} \right) = h\left( L \right) \times \left( {r - l} \right)$
然而,此时我们根据 $r > R \Rightarrow r - l > R - l = R - L$ 又有
$S = h\left( L \right) \times \left( {r - l} \right) > \min \left( {h\left( L \right),h\left( R \right)} \right) \times \left( {R - L} \right)$
很明显,$\min \left( {h\left( L \right),h\left( R \right)} \right) \times \left( {R - L} \right)$ 已经是最大的容积了,显然不应当存在不这还大的容器,
因此,证明了假设:当左指针先走到 $L$ 时,接下来的每一步都只能是右指针左移一格,左指针始终不能动;
类似地,也可以证明,当右指针先走到 $R$ 时,接下来的每一步都只能是左指针右移一格,右指针始终不能动;
证毕。
AC代码:
class Solution
{
public:
int maxArea(vector<int>& height)
{
int mx=,l=,r=height.size()-;
while(l<r)
{
mx=max(mx,min(height[l],height[r])*(r-l));
if(height[l]<height[r]) l++;
else r--;
}
return mx;
}
};
LeetCode 11 - 盛最多水的容器 - [双指针暴力]的更多相关文章
- Java实现 LeetCode 11 盛最多水的容器
11. 盛最多水的容器 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) ...
- 力扣Leetcode 11. 盛最多水的容器
盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找 ...
- [LeetCode]11. 盛最多水的容器(双指针)
题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...
- Leetcode 11.盛最多水的容器 By Python
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- LeetCode 11. 盛最多水的容器(Container With Most Water)
题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...
- LeetCode:盛最多水的容器【11】
LeetCode:盛最多水的容器[11] 题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 ...
- 【LeetCode】盛最多水的容器【双指针+贪心 寻找最大面积】
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- Leetcode题库——11.盛最多水的容器
@author: ZZQ @software: PyCharm @file: maxArea.py @time: 2018/10/11 21:47 说明:给定 n 个非负整数 a1,a2,...,an ...
- 【LeetCode】11. 盛最多水的容器
题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...
随机推荐
- 应用程序默认安装在C盘后启动时提示权限不足想起的。。。
最近不少经销商用户反映,在使用win 7的系统的电脑上安装我们的软件后,开启系统时提示权限不足,无法启动软件. 而在xp系统下则没有这个问题,原因在于我们将系统的默认安装路径选择在了C盘了,而win ...
- SED单行脚本快速参考(Unix 流编辑器)(转)
sed.sourceforge.net被封杀,特在此处贴上官方的sed 使用说明文档 SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE S ...
- MDK-ARM输出HEX文件重命名设置
输出的可执行文件和库的名称就是在这里定义.比如我们常见输出Hex文件,其名称就是这里定义的.
- lua -- 生成协议
这是爬塔的协议 <?xml version="1.0" encoding="utf-8" ?> <coder name="Tower ...
- [Big Data - Kafka] Kafka设计解析(三):Kafka High Availability (下)
Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...
- RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)
RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct, ...
- TCP/IP四层模型讲解笔记
本文转载自:http://www.vuln.cn/2041 OSI七层模型 表示层:用来解码不同的格式为机器语言,以及其他功能. 会话层:判断是否需要网络传输. 传输层:识别端口来指定服务器,如指 ...
- 【iCore4 双核心板】4.3寸液晶模块程序发布
一.说明 1.本资料包程序包含两部分,"CAPTURE"为液晶显示截图,"tft4.3"为ARM程序. 2.此程序只适合iCore4液晶模块. 3.iCore4 ...
- Ansible and FileBeta
使用Ansible通过ssh批量读取和修改Client设备 1. 安装ansible工具 apt-get install ansible 2. 添加需要访问的client信息 ansible配置文件如 ...
- Git 推送操作
Jerry 修改了他的最后一次提交的修改操作,他已经准备好将更改.推操作的数据永久存储的 Git 仓库.推操作成功后,其他开发人员可以看到Jerry 的变化. 他执行的git日志命令来查看提交的细节. ...