题目如上;

简单浏览题目,大家一定会想到暴力枚举法,将所有可能依次列举出来,但这题目难度设置为中等,那暴力枚举一定会超时,于是我们需要更优的算法。

仔细观察,我们可以将最初的容器壁依次往中间推进,将原先较小的壁替换成里面的壁,然后在对比容量是否增加,直到左边和右边重合。

向中间推进的过程中,我们可能会遇到以下几种情况:

1,替换的容器壁比原先小,且宽度减小,则容量一定比原先小;

2,替换的容器壁和原先一样,但宽度减小,则容量一定比原先小;

3,替换的容器壁比原先大,则需要判断容量是否增加;

左右壁向中间推进,我们可以联想到双指针算法,于是我们将最初的容器壁设置在最左边和最右边,然后实现上述思路,即可得到答案。

本题难点:我们很难想到将最初的容器壁设置在最外围然后向中间推进的思路。

算法优点:时间复杂度从O(n2)降至O(n)。

代码如下:

int maxArea(int* height, int heightSize) {
    int right=heightSize-1,left=0;
    int max=0;
    while(right>left){
        int minHeight=height[left]<height[right]?height[left]:height[right];
        if(max<minHeight*(right-left)){
            max=minHeight*(right-left);
        }
        if(height[right]<height[left]){
            right--;
        }
        else{
            left++;
        }
    }
    return max;
}

 

更多推荐