1 题目
2 分析
两个板的面积=min(height[i],height[j])*(j-i)
思路一:
两个指针分别指向最左和最右端,假设随便移动两个指针,就能暴力穷举所有的情况,求最大值即可。(其实也就是双重for循环的写法)
时间复杂度:O(n^2)
思路二:
但是指针的移动是可以有规律的:两个指针分别指向最左和最右端,选取更短板的指针向中间移动。
这样时间复杂度减为:O(n)
为什么可以这样操作呢?
解释:
- 如果我们移动指向长的板的指针向里,两个板的距离
(j-x-i)
在变小,面积的高度要么不变,要么会变小,没必要考虑,因此我们就不枚举这种情况,把它排除了。 - 如果我们移动指向短的板的指针向里,两个板的距离
(j-x-i)
在变小,面积的高度变大、变小、不变都有可能,因此需要我们去枚举。 - 那么为啥不考虑往外移动呢?两个板的距离在变大呀。笨蛋,我们就是从外往里移动的呀,那种情况已经考虑了。
3 代码
class Solution {
public:
int maxArea(vector<int>& height) {
int i=0;
int ans=0;
int j=height.size()-1;
while(i<j){//两个指针
if(height[i]<=height[j]){
ans=max(ans,(j-i)*height[i]);//更新最大值
i++;
}
else if(height[i]>height[j]){
ans=max(ans,(j-i)*height[j]);
j--;
}
}
return ans;
}
};
leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n) leecode100_第5题_盛最多水的容器_双指针_O(n)