LeetCode 11 Container With Most Water

题意:

数组A中第i个元素A[i]表示一块两端在(i,0)和(i,A[i])的板,从中选出2块板,使得它们与x轴围成的桶装水体积最大。


思路:

因为装水体积只和矮的板有关,因此我们从高到低的考虑板子,这样当前考虑的板子A[i]就是装水的高度。

高度确定时,让桶尽量的宽。可以用l和r表示已经考虑过的板子的x坐标的最小和最大值。

若l <= i <= r,则桶宽max( i - l, r - i );若i < l,则桶宽r - i;若i > r,则桶宽i - l。

时间复杂度O(nlogn)。

官方题解中的O(n)做法是错误的,解法没有覆盖所有的可能,有点类似“用贪心策略做dp而漏解”。


代码:

//
// Created by house on 1/9/17.
//

class Solution {
public:
    int maxArea(vector<int> &height) {
        int ans = 0;
        vector <pair<int, int>> rank;
        for (int i = 0; i < height.size(); ++i) {
            rank.push_back(make_pair(height[i], i));
        }
        sort(rank.begin(), rank.end());
        int l, r;
        l = r = rank.rbegin()->second;
        for (int i = rank.size() - 2; i >= 0; --i) {
            int pos = rank[i].second, w = 0;
            if (pos < l) {
                w = r - pos;
                l = pos;
            } else if (pos > r) {
                w = pos - l;
                r = pos;
            } else {
                w = max(r - pos, pos - l);
            }
            if (ans < w * rank[i].first) {
                ans = w * rank[i].first;
            }
        }
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值