
11 盛最多水的容器(暴力、双指针)
发布日期:2021-05-07 21:50:44
浏览次数:26
分类:精选文章
本文共 1045 字,大约阅读时间需要 3 分钟。
为了找到能够容纳最多水的两条垂直线,我们可以使用双指针的方法来优化计算过程。这种方法的时间复杂度为O(n),空间复杂度为O(1),非常高效。
思路分析
问题理解:
- 给定n个非负整数,每个数代表坐标中的一个点(i, ai)。
- 画n条垂直线,每条线的两个端点分别为(i, ai)和(i, 0)。
- 目标是找到两条线,使得它们与x轴构成的容器可以容纳最多的水。
直观思路:
- 水的体积取决于两根线中较低的那根的高度,乘以两根线之间的距离。
- 通过暴力破解计算所有可能的两根线组合,虽然简单但时间复杂度为O(n^2),不适用于大规模数据。
优化思路:
- 使用双指针技术,左指针l从数组开头开始,右指针r从数组末尾开始。
- 每次比较左右两指针对应的高度,移动较短的指针以尽可能增加水量。
- 计算当前水量并更新最大值,直到左右指针相遇。
代码实现
public int maxArea(int[] height) { int maxArea = 0; int l = 0; int r = height.length - 1; while (l < r) { int currentHeight = Math.min(height[l], height[r]); int currentWidth = r - l; int currentArea = currentHeight * currentWidth; if (currentArea > maxArea) { maxArea = currentArea; } if (height[l] < height[r]) { l++; } else { r--; } } return maxArea;}
解释
- 初始化:左指针l从数组起点开始,右指针r从数组终点开始。
- 循环过程:
- 计算当前两根线的较小高度作为水的高度。
- 计算当前两根线之间的横向距离。
- 计算当前水量并更新最大值。
- 将较短的指针(高度较小的那根线)向中间移动,以尝试找到更大的水量。
- 终止条件:当左右指针相遇时,无法再找到更大的水量,循环结束。
- 返回结果:最大水量即为所求。
这种方法通过一次性遍历数组,避免了多次重复计算,确保了高效性和正确性。
发表评论
最新留言
很好
[***.229.124.182]2025年03月23日 23时41分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++中找资源或者函数的方法
2019-03-06
一些留给自己的思考题(只求回过头来能够有所获)
2019-03-06
SQL函数返回表的写法
2019-03-06
delete对象时会自动调用类的析构函数
2019-03-06
C++ 子类对象直接赋值给父类对象可行,反过来不行
2019-03-06
WMWare下安装centOS7,并使用xshell进行连接记录.
2019-03-06
linux下同一个动态库名为何辣么多的.so文件
2019-03-06
SQL联表的方式(逗号, Left Join, Right Join)
2019-03-06
牛客网输入输出举例
2019-03-06
字符串初始化时的注意点
2019-03-06
dll路径加载顺序
2019-03-06
悬垂指针和野指针的区别
2019-03-06
软考相关试题
2019-03-06
顺序表的操作
2019-03-06
常量表达式
2019-03-06
POD类型
2019-03-06
安装HDF5及在VS下配置HDF5
2019-03-06
const与常量,傻傻分不清楚~
2019-03-06
图解哈希表及其原理
2019-03-06
Head First设计模式——迭代器模式
2019-03-06