算法第七次作业

来源:互联网 发布:c语言获取网页内容 编辑:程序博客网 时间:2024/05/22 09:50

题目:
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;    }};
原创粉丝点击