11.盛最多水的容器

中等难度题,通过率63.8%


最优解法:双指针法

分析

我们先从题目中的示例开始,一步一步地解释双指针算法的过程。稍后再给出算法正确性的证明。
题目中的示例为:

[1, 8, 6, 2, 5, 4, 8, 3, 7]^                       ^

在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 min(1,7) ∗ 8 = 8。

此时我们需要移动一个指针。移动哪一个呢?直觉告诉我们,应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由


决定的。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针

所以,我们将左指针向右移动:

[1, 8, 6, 2, 5, 4, 8, 3, 7]^                    ^


此时可以容纳的水量为 min(8,7) ∗ 7 = 49。由于右指针对应的数字较小,我们移动右指针:

[1, 8, 6, 2, 5, 4, 8, 3, 7]^                 ^


此时可以容纳的水量为min(8,3) ∗ 6 = 18。由于右指针对应的数字较小,我们移动右指针:

[1, 8, 6, 2, 5, 4, 8, 3, 7]^              ^


此时可以容纳的水量为min(8,8) ∗ 5 = 40。两指针对应的数字相同,我们可以任意移动一个,例如左指针:

[1, 8, 6, 2, 5, 4, 8, 3, 7]^           ^


此时可以容纳的水量为 min(6,8) ∗ 4 = 24。由于左指针对应的数字较小,我们移动左指针,并且可以发现,在这之后左指针对应的数字总是较小,因此我们会一直移动左指针,直到两个指针重合。在这期间,对应的可以容纳的水量为:min(2,8) ∗ 3 = 6,min(5,8) ∗ 2 = 10,min(4,8) ∗ 1 = 4。



在我们移动指针的过程中,计算到的最多可以容纳的数量为 49,即为最终的答案。

代码

public class Solution {public int maxArea(int[] height) {int l = 0, r = height.length - 1;int ans = 0;while (l < r) {int area = Math.min(height[l], height[r]) * (r - l);ans = Math.max(ans, area);if (height[l] <= height[r]) {++l;}else {--r;}}return ans;}
}

复杂度分析

  • 时间复杂度:O(N),双指针总计最多遍历整个数组一次。
  • 空间复杂度:O(1),只需要额外的常数级别的空间。

LeetCode刷题-11相关推荐

  1. LeetCode刷题记录11——290. Word Pattern(easy)

    LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...

  2. LeetCode刷题记录4——67. Add Binary(easy)

    LeetCode刷题记录4--67. Add Binary(easy) 目录 LeetCode刷题记录4--67. Add Binary(easy) 题目 语言 思路 后记 题目 今天这题是与字符串相 ...

  3. LeetCode刷题记录1——717. 1-bit and 2-bit Characters(easy)

    LeetCode刷题记录1--717. 1-bit and 2-bit Characters(easy) LeetCode刷题记录1--717. 1-bit and 2-bit Characters( ...

  4. Leetcode刷题第1题:两数之和(基于Java语言)

    ** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...

  5. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法

    LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...

  6. C#LeetCode刷题-程序员面试金典

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...

  7. C#LeetCode刷题-剑指Offer

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-剑指Offer | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode剑指Offer ...

  8. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% 困难 53 最 ...

  9. C#LeetCode刷题-二分查找​​​​​​​

    二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

最新文章

  1. python学习笔记七
  2. Mac下通过Anaconda安装Tensorflow
  3. 2009最后一天,为了期盼而祝福
  4. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你
  5. 前端学习(2158):webpack配置文件的分离
  6. mysql jdbc 表结构_JDBC操作表:JDBC修改表结构
  7. 数据科学 IPython 笔记本 8.17 使用 Seaborn 的可视化
  8. 如何连接sql托管实例_如何使用Windows托管的文件共享来支持SQL Server容器
  9. matlab2c使用c++实现matlab函数系列教程-triu函数
  10. 东北大学金工实习考试题库
  11. 任天堂如何通过旧技术赢得胜利
  12. 各向异性元件中的偏振效应
  13. Microsoft Office XP 完美迷你安装版
  14. 【CQF Finance Class 3 债券】
  15. php的命令执行函数,PHP命令执行函数 - osc_joe3czc9的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. Codeforces 227E/226C Anniversary 斐波那契数列性质+矩阵快速幂
  17. win10卸载软件_教你彻底关闭Win10自动更新,以及卸载预装应用
  18. 移动硬盘无法访问设备未就绪资料找到的法子
  19. 楷书书法规则_毛笔书法楷书的结构规则
  20. 武未转变服务器tp,2020年十大经典战役推荐:用一张TP让你知道垄断的威力

热门文章

  1. CUDA Installer 前面的 X
  2. java毕业设计——基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码)——网络新闻分析系统
  3. 网狐荣耀,android编译
  4. 尚硅谷大数据开发Day04
  5. MapStruct系列(6)-映射集合、映射Stream流、映射枚举
  6. 7.12 vowels.c 程序
  7. uniapp vue3版本 引用color-ui的cu-custom组件问题
  8. 如何减少APP电量消耗?
  9. photoshop图像合成教程之将人物和风景合成一张图片
  10. Mybatis缓存探索,查询集合后修改内容,再次执行sql查询结果发现是被修改过的