这是悦乐书的第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)的更多相关文章

  1. Java实现 LeetCode 11 盛最多水的容器

    11. 盛最多水的容器 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) ...

  2. LeetCode 11. 盛最多水的容器(Container With Most Water)

    题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...

  3. 11. Container With Most Water 装水最多的容器

    [抄题]: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...

  4. Leetcode 11.盛最多水的容器 By Python

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  5. LeetCode 11 - 盛最多水的容器 - [双指针暴力]

    题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/ 给定 n 个非负整数 $a_1,a_2,\cd ...

  6. 力扣Leetcode 11. 盛最多水的容器

    盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找 ...

  7. [LeetCode]11. 盛最多水的容器(双指针)

    题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...

  8. [Swift]LeetCode11. 盛最多水的容器 | Container With Most Water

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  9. leetcode 盛水最多的容器 解析

    采用双指针法: 主要思想:定义头尾两个指针,分别向中间遍历,当相遇时结束循环.存储每一次遍历容器盛水的最大容量,并不断更新. 盛水的最大容量为 左右指针高度的最小值 乘以 左右指针的距离即宽度. 则可 ...

随机推荐

  1. Unity3D之Mesh(五)绘制圆

    前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最 ...

  2. 一些有意思的面试题(持续更新) .C语言编程技巧札记

    一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...

  3. Oracle学习笔记_04_多表查询

    一.概念: 1.多表连接有以下几种分法: (1)内连接           vs          外连接 (左.右.满) (2)等值连接        vs         不等值连接 (3)非自连 ...

  4. Cookie是以文本文件保存在客户端的,所以说cookie对象从本质而言是 字符串,所以取值时用字符串,或其数组

  5. codeforces 650D D. Image Preview (暴力+二分+dp)

    题目链接: http://codeforces.com/contest/651/problem/D D. Image Preview time limit per test 1 second memo ...

  6. Postgresql windows下安装过程

    1.下载前三个软件: 理论上安装Perl,TCL,Bison and Flex这三个插件 实际上安装ActiveState Perl,ActiveState tcl ,MinGW 因为MinGW包括了 ...

  7. MySQL函数不能创建的解决方法(转)

    在使用MySQL数据库时,有时会遇到MySQL函数不能创建的情况.下面就教您一个解决MySQL函数不能创建问题的方法,供您借鉴参考. 出错信息大致类似: ERROR 1418 (HY000): Thi ...

  8. druid数据源的加密解密工具

    数据库得加密 先来一个网上大多数的教程吧,一个比较好的教程,如下. jar包版本:druid-1.0.13.jar 1. 加密,用以下命令将用户名和密码加密 cmd命令行执行 java -cp D:/ ...

  9. ss3

    1)执行如下命令,进行安装shadowsocks(命令需要一条条的输入,然后回车,执行完一条,在执行下一条命令),过程中可能会让你选择确认的地方,直接输入"y"回车即可: yum ...

  10. ORACLE AWR报告生成步骤

    ORACLE AWR报告生成步骤 (以PL/SQL中命令窗口为例) 1.sqlplus或plsql的commod窗口(命令窗口)运行命令 @D:\oracle\product\10.2.0\db_1\ ...