★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起做一道双指针算法题--盛水最多的容器~
目录
一 题目
二 算法解析
三 编写算法
一 题目
11. 盛最多水的容器 - 力扣(LeetCode)
二 算法解析
解法1:暴力枚举
算法思路:双层循环,枚举出能构成的所有容器,找出其中容积最⼤的值。(会超时)
解法2:对撞指针
如题目中的示例1:1 8 6 2 5 4 8 3 7
算法思路:
设两个指针 left , right 分别指向容器的左右两个端点,容器的左边界为 height[left] ,右边界为 height[right] 。
如果此时我们固定⼀个边界,改变另⼀个边界,假设height[left] < height[right],水的容积:
- 容器的宽度⼀定变小。
- 由于左边界较小,决定了水的高度。如果改变左边界,新的水面高度不确定,但是⼀定不会超 过右边的柱⼦高度,因此容器的容积可能会增大。
- 如果改变右边界,无论右边界移动到哪里,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会 超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积⼀定会变小的。
故左边界和其余边界的组合情况都可以舍去。
循环上述过程,每次都可以舍去⼤量不必要的枚举过程,直到 left 与 right 相遇。期间产⽣的所有的容积里面的最大值,就是最终答案。
三 编写算法
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int v = 0;
while(left < right)
{
int ret = min(height[left], height[right]) * (right - left);
v = max(ret, v); // 更新最大面积
// 哪个小删哪个
if(height[left] < height[right])
left++;
else
right--;
}
return v;
}
};