成最多水的容器

原题链接

首先根据题意可以列出暴力解法,时间复杂度为O(n^2),很明显会超时。

接下来讲解双指针解法:

设两指针i , j ,指向的水槽板高度分别为h[i] , h[j] 。由于可容纳水的高度由两板中的 短板 决定,因此可得面积公式S=min(h[i],h[j])*(j-i).

在每个状态下,无论是长板还是短板向内收一格都会导致X减小1,就会有如下两种情况:

1、短板向内收缩min(h[i],h[j])可能会变大,S可能会增大。

2、长板向内收缩min(h[i],h[j])不变或减小,S一定减小。

因此我们根据单调性,我们每次让短板向内收缩。

Code

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max_=0,l=0,r=height.size()-1;
        while (l<r){
            int h=min(height[l],height[r]);
            max_=max(max_,h*(r-l));
            if (height[l]<height[r]) l++;
            else r--;
        }
        return max_;
    }
};

 

posted @ 2024-02-12 15:35  黑屿白  阅读(22)  评论(0)    收藏  举报