双指针算法专题之——盛最多水的容器
文章目录
- 题目介绍
- 思路分析
- 暴力枚举(超时)
- 优化:左右指针
- AC代码
题目介绍
链接: 11. 盛最多水的容器
思路分析
暴力枚举(超时)
首先这道题最容易想到的就是暴力枚举,枚举所有的情况,选出最大值就是
但是!不好意思,超时了
那如何优化呢?
优化:左右指针
我们来分析一下:
看题目中的示例1
不过我们可以取出一个小的区间来看,便于分析
我们可以先来看两个端点值6和4与x轴组成的容器的储水量,其实就是面积。
高分别是6和4。
根据木桶原理,能存多少水取决于最短的那块板,所以高就是4,宽是3,容量就是12
那如果是4和5呢?
高不变,宽减小,容量必减小。
那4和2呢?
高和宽都减小了,容量必定也减小。
这样其实就发现了一个规律:
如果从区间的两个端点开始判断,两个端点中小的那一个数,另一端向内收缩,容量必定会减小,我们只需要记录两端点组成容器的容量(它一定是当前区间储水量的最大值)。
因为向内收的话,宽度一定减小,而高度要么不变,要么也减小。
所以两个端点中小的那一个数就可以直接排除了!
然后在剩下的区间中,依然是这样的规律,只需记录当前区间两端点组成的容器大小,然后两个端点中小的那个数直接排除!
后续都是这样,最后在我们记录的每一个区间的容量中,最大值就是结果!
所以我们就可以用左右指针,从两端往中间走,进行判断即可。
AC代码
过啦!
// 左右指针 O(n)
int maxArea(vector<int>& height)
{
int left = 0;
int right = height.size() - 1;
int max = 0;
while (left < right)
{
int area = (right - left) * min(height[left], height[right]);
if (area > max)
max = area;
if (height[right] < height[left])
right--;
else
left++;
}
return max;
}