LeetCode.11-装水最多的容器(Container With Most Water)
这是悦乐书的第350次更新,第375篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Medium级别的第5题(顺位题号是11)。给定n个非负整数a1,a2,…,an,其中每个表示坐标(i,ai)处的点。绘制n条垂直线,使得线i的两个端点位于(i,ai)和(i,0)。找到两条线,它们与x轴一起形成一个容器,这样容器就含有最多的水。
注意:您可能不会倾斜容器,n至少为2。

上面的垂直线由数组[1,8,6,2,5,4,8,3,7]表示。 在这种情况下,容器可容纳的最大水面积(蓝色部分)为49。例如:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
02 第一种解法
暴力解法,使用两层循环,装水容器的宽为两元素索引之差,高为两元素中的较小值,利用宽乘以高,计算容器的面积,取其中较大值返回。
此解法的时间复杂度是O(N^2),空间复杂度为O(1)。
public int maxArea(int[] height) {
int result = 0, n = height.length;
for (int i=0; i<n; i++) {
for (int j=i+1; j<n; j++) {
int w = j-i;
int h = Math.min(height[i], height[j]);
result = Math.max(result, w*h);
}
}
return result;
}
03 第二种解法
双指针。定义两个变量,一个从数组的头部开始,记为start,另外一个从尾部开始,记为end,依旧按照第一种解法中那样计算面积和取最大值,然后来判断哪个指针该往哪个方向移动。
如果start位置的元素值小于end位置的元素值,那么start位置需要找到一个更大的值,才有可能比当前的面积大,所以start需要自增1,向end方向移动,反之就是end位置需要向start位置方向移动,来找到一个更大的元素值。
此解法的时间复杂度是O(N),空间复杂度为O(1)。
public int maxArea2(int[] height) {
int start = 0, end = height.length-1;
int result = 0;
while (start < end) {
int w = end - start;
int h = Math.min(height[end], height[start]);
result = Math.max(result, w*h);
if (height[start] < height[end]) {
start++;
} else {
end--;
}
}
return result;
}
04 第三种解法
如果你觉得第二种解法中,没有讨论两边的元素相等时的情况,那咱也可以再多加一个判断。
public int maxArea3(int[] height) {
int start = 0, end = height.length-1;
int result = 0;
while (start < end) {
int w = end - start;
int h = Math.min(height[end], height[start]);
result = Math.max(result, w*h);
if (height[start] < height[end]) {
start++;
} else if(height[start] > height[end]) {
end--;
} else {
start++;
end--;
}
}
return result;
}
05 小结
算法专题目前已连续日更超过六个月,算法题文章218+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.11-装水最多的容器(Container With Most Water)的更多相关文章
- Java实现 LeetCode 11 盛最多水的容器
11. 盛最多水的容器 给定 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).找出其中的两 ...
- 11. Container With Most Water 装水最多的容器
[抄题]: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...
- Leetcode 11.盛最多水的容器 By Python
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- LeetCode 11 - 盛最多水的容器 - [双指针暴力]
题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/ 给定 n 个非负整数 $a_1,a_2,\cd ...
- 力扣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).找出其中的两 ...
- [Swift]LeetCode11. 盛最多水的容器 | Container With Most Water
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- leetcode 盛水最多的容器 解析
采用双指针法: 主要思想:定义头尾两个指针,分别向中间遍历,当相遇时结束循环.存储每一次遍历容器盛水的最大容量,并不断更新. 盛水的最大容量为 左右指针高度的最小值 乘以 左右指针的距离即宽度. 则可 ...
随机推荐
- vmware在桥接模式下配置centos7网络
首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sysconfig/network-scripts/ #进入网络配置 ...
- myod中遇到的问题
一.准备工作 首先在编程之前遇到的第一个问题就是要了解需要编出一个怎样的代码,了解od -tx -tc的具体意思,并观察其输出结果. -tc代表着输出ASCII字符,而-tx则是代表着输出ASCII字 ...
- openfire存储中文字符乱码解决办法
转载于: Xmpp问题总结:处理Openfire 中文乱码问题(2) openfire是一个非常不错的IM服务器,而且是纯Java实现,具有多个平台的版本,他的数据存储可以采用多种数据库,如MySQL ...
- python中全局变量的使用
python中在module定义的变量可以认为是全局变量, 而对于全局变量的赋值有个地方需要注意. test.py ------------------------------------------ ...
- Java中读取输入方式的性能比较
程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...
- makefile 基础知识
$@ 目标文件名 $< 第一个依赖文件名 $^ 规则所有依赖文件列表 如果不想让执行语句被打印出来,就在语句前面加上@符号 模式规则 %.o:%.c 后缀规则 .c.o 生成单进程的Mak ...
- wpf staticresource 是不允许向前引用(forward reference)的
不允许向前引用(forward reference)在C/C++中中很常见,即在语法上,未定义变量.类之前,不能使用. 没想到wpf中的wpf staticresource也遵循这种规则.资源字典中, ...
- HDFS中hsync方法介绍
HDFS中hsync方法介绍 原创文章,转载请注明:博客园aprogramer 原文链接:HDFS中hsync方法介绍 1. 背景介绍 HDFS在写数据务必要保证数据的一致性与持久性,从HDFS最初的 ...
- Framework配置错误
转自:http://blog.csdn.net/ked/article/details/25052955 VS2012命令提示符无法使用的解决方法 打开VS2012命令提示符时报错“ERROR: Ca ...
- Jumony.Core非常厉害的一个开源项目!
简单的说,就是解析html文档的,以前发送一个get请求获取一个页面的html文本后,想要获取里面的数据都是使用正则表达式.(非常的苦逼), 现在用这个获取就very easy! 安装的话在Nu Ge ...