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. Docker挂载主机目录Docker访问出现Permission denied的解决办法
  2. 推荐10个好用到爆的Jupyter Notebook插件,让你效率飞起
  3. 提问的智慧 如何得到好的帮助(转)
  4. 用Gridview和ObjectDataSource轻松实现自定义分页
  5. python如何打印字符串_如何在Python中打印“漂亮”字符串输出
  6. ffmpeg 同宽度 画中画_FFmpeg中overlay滤镜用法-水印及画中画
  7. Linux文件去掉^M
  8. java学习(137):java异常初识
  9. 腾讯2019秋招笔试真题
  10. PHP表单提交后页面跳转,PHP在表单提交后重定向到另一个页面
  11. hive對於數據是懶加載的_hive 安装 文档
  12. 学python需要什么基础-0基础学Python 需要些什么?
  13. RESTful规范1
  14. Java菜鸟教程 一些简单的练习
  15. 深度学习入门(看了就会)
  16. micropython 固件编译关于 spi psram opi qspi 的设置
  17. 试试mysql数据碎片整理吧解决astgo经常死机变慢的问题
  18. 计算机网络复习资料(前六章谢希仁版)
  19. 输入日期查星座 php,php根据日期显示所在星座的方法,php日期所在星座_PHP教程...
  20. ClickHouse 合并树表引擎 MergeTree 原理分析

热门文章

  1. 20071011听力原文
  2. 项目总监岗位职责与思考
  3. 产品嘚吧嘚系列:大学城020产品模式研讨
  4. 吉安计算机教师招聘,吉安教师招聘
  5. 《烈火军校》主题曲插曲
  6. python批量修改文件名称及文件属性
  7. 网口压线顺序_家里网线的接法和顺序
  8. Qt 官方资源下载地址
  9. Leecode-SQL 1407. 排名靠前的旅行者
  10. 基于Javaweb的小项目(类似于qqzone) 4 ——通用代码模块 - 过滤器、异常处理、servlet通用代码块