11.Container With Most Water

给定一个数组,数组中的数字在坐标系中按柱状图分布,选取两根柱子,与横坐标形成水池,求最大的水池面积。

 

 

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

 

思路:
一开始运用暴力结题,O( n*n )的时间复杂度,然而不AC。
看了答案,运用两个下标 left = 0, right = n-1 ,每次移动 left和right中值最小的那一个,因为木桶原理木桶的容量取决于最短的那块木板,只有把短板补长,才能使木桶容量更大。每一次移动得到的面积都要和已有的面积比较,若新的更大,则更新之前的。这样,能在线性复杂度下AC。

int maxArea(vector<int>& height) {
    int n = height.size(), res = 0, l = 0, r = n - 1;
    while (l < r) {
        int min = height[l] > height[r] ? height[r] : height[l];
        int area = min * (r - l);
        res = area > res ? area : res;
        if (height[l] > height[r]) r--;
        else l++;
    }
    return res;
}

 

posted @ 2020-05-16 22:05  星海寻梦233  阅读(106)  评论(0编辑  收藏  举报