一、题目分析

给定一个数组,数组中的每个数代表一条垂直于 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;

        
    }
};

更多推荐