LeetCode刷题-11
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相关推荐
- LeetCode刷题记录11——290. Word Pattern(easy)
LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...
- LeetCode刷题记录4——67. Add Binary(easy)
LeetCode刷题记录4--67. Add Binary(easy) 目录 LeetCode刷题记录4--67. Add Binary(easy) 题目 语言 思路 后记 题目 今天这题是与字符串相 ...
- 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( ...
- Leetcode刷题第1题:两数之和(基于Java语言)
** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...
- c语言贪心算法合并箭,LeetCode刷题题库:贪心算法
LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...
- C#LeetCode刷题-程序员面试金典
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...
- C#LeetCode刷题-剑指Offer
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-剑指Offer | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode剑指Offer ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% 困难 53 最 ...
- C#LeetCode刷题-二分查找
二分查找篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
最新文章
- Docker挂载主机目录Docker访问出现Permission denied的解决办法
- 推荐10个好用到爆的Jupyter Notebook插件,让你效率飞起
- 提问的智慧 如何得到好的帮助(转)
- 用Gridview和ObjectDataSource轻松实现自定义分页
- python如何打印字符串_如何在Python中打印“漂亮”字符串输出
- ffmpeg 同宽度 画中画_FFmpeg中overlay滤镜用法-水印及画中画
- Linux文件去掉^M
- java学习(137):java异常初识
- 腾讯2019秋招笔试真题
- PHP表单提交后页面跳转,PHP在表单提交后重定向到另一个页面
- hive對於數據是懶加載的_hive 安装 文档
- 学python需要什么基础-0基础学Python 需要些什么?
- RESTful规范1
- Java菜鸟教程 一些简单的练习
- 深度学习入门(看了就会)
- micropython 固件编译关于 spi psram opi qspi 的设置
- 试试mysql数据碎片整理吧解决astgo经常死机变慢的问题
- 计算机网络复习资料(前六章谢希仁版)
- 输入日期查星座 php,php根据日期显示所在星座的方法,php日期所在星座_PHP教程...
- ClickHouse 合并树表引擎 MergeTree 原理分析