算法第七次作业

题目:
11. Container With Most Water
Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.
解析:
一开始尝试暴力遍历,毫无意外的超时了,那么这里我们使用一种窗口滑动的方法,将时间复杂度从O(n^2)降到O(n)。
我们利用两个指针,一个从头开始,一个从尾部开始,每次都将高度较小的那个指针向另一个指针移动,直到两个指针重合这时面积是0。
为什么要移动高度较小的指针呢?因为你移动高度较大的指针,因为短板没变,两个指针距离减小,面积必然减小,那么移动高度较小的指针则又面积可能变得更大,其实这既是一种动态规划,又是一种贪心算法。
减少循环的核心思路是省去没有必要的遍历,并且确保所需的答案一定能被遍历到,
最后根据反证法可以证明不存在另一种方法能求得最大的面积。
代码:

class Solution {
public:
    int min(int a, int b)
    {
        return (a>b)?b:a;
    }
    int maxArea(vector<int>& height) {
        vector<int>::iterator a,b;
        a=height.begin();
        b=--height.end();
        int area,maxarea=0;
        while(a!=b)
        {
            area=min(*a,*b)*(b-a);
            maxarea=(maxarea>area)?maxarea:area;
            if(*a>*b)
                b--;
            else
                a++;

        }


        return maxarea;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值