小白0基础刷LeetCodehot100(5)盛最多水的容器
·


一、题目分析
给定一个数组,数组中的每个数代表一条垂直于 x 轴的线的高度。我们要从中选出两条线,使得它们与 x 轴围成的容器能装下最多的水。
容器的体积计算公式:两条线中比较矮的那条线的高度 × 两条线的距离
min(height[i], height[j]) * (j - i)
二、为什么暴力解法不行?
如果我们枚举所有可能的两条线组合,时间复杂度是 O(n²),当数组长度 n 很大时(比如 10⁴),会直接超时。因此需要更高效的 O(n) 解法 —— 双指针法。
三、双指针思路:
给一个左指针l从左往右动,一个右指针r从右往左动,同时计算着当前容器的体积,并更新最大容积体积。
当heihgt[l] < height[r]时候,把l向右移动;当height[r]<height[l]时候,把r向左移动。
总之,就是移动比较矮的指针。
原因:移动前的体积:是二者最矮的b * 二者距离r-l。
如果移动高的话,二者最矮的不变仍为b 二者距离肯定变短,所以移动高的体积 最大就为二者最矮的b * 新的r-l 所以肯定体积比之前的小。
移动矮的,二者的距离肯定还是缩小,但是移动矮的可能会比之前最高的还高,那么体积就有增大的可能。

代码:
class Solution {
public:
int maxArea(vector<int>& height) {
//定义左右指针
int left = 0;
int right = height.size()-1;
int ans = 0;
while(left < right){ //只要左指针小于右指针就再循环里 直到二者相遇
int area = min(height[left],height[right]) * (right - left);//计算体积存放到area中
ans = max(ans , area); //ans最大值 存放最大的体积 每个循环进行比较 把最大的放到ans里
if(height[left] <= height[right]){//比较把矮的移动
++left;
}
else{
--right;
}
}
return ans;
}
};
更多推荐


所有评论(0)