xinyu04

导航

LeetCode Container With Most Water 区间贪心

You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).

Find two lines that together with the x-axis form a container, such that the container contains the most water.

Return the maximum amount of water a container can store.

Solution

很容易知道答案是 \(\max_{i,j}(|i-j|\times \min(h[i],h[j]))\),如果遍历 \(i,j\),则复杂度为 \(O(n^2)\)。但是可以贪心的去选择 (\(O(n)\)),我们只需要每次移动高度较小的一端:

点击查看代码
class Solution {
private:
    int ans = -1;
public:
    int maxArea(vector<int>& height) {
        int n = height.size();
        if(n==2)return min(height[0],height[1]);
        int st = 0, ed = n-1;
        ans = (ed-st)*min(height[ed], height[st]);
        while(st<ed){
            if(height[st]<=height[ed]){
                st+=1;
            }
            else ed-=1;
            ans = max(ans, (ed-st)*min(height[ed], height[st]));
        }
        return ans;
    }
};

posted on 2022-07-10 20:56  Blackzxy  阅读(13)  评论(0编辑  收藏  举报