Code Ganker: Container With Most Water -- LeetCode

2014年2月19日星期三

Container With Most Water -- LeetCode

原题链接: http://oj.leetcode.com/problems/container-with-most-water/
首先一般我们都会想到brute force的方法,思路很简单,就是对每一对pair都计算一次容积,然后去最大的那个,总共有n*(n-1)/2对pair,所以时间复杂度是O(n^2)。
接下来我们考虑如何优化。思路有点类似于Two Sum中的第二种方法--夹逼。从数组两端走起,每次迭代时判断左pointer和右pointer指向的数字哪个大,如果左pointer小,意味着向左移动右pointer不可能使结果变得更好,因为瓶颈在左pointer,移动右pointer只会变小,所以这时候我们选择左pointer右移。反之,则选择右pointer左移。在这个过程中一直维护最大的那个容积。代码如下:
public int maxArea(int[] height) {
    if(height==null || height.length==0)
        return 0;
    int l = 0;
    int r = height.length-1;
    int maxArea = 0;
    while(l<r)
    {
        maxArea = Math.max(maxArea, Math.min(height[l],height[r])*(r-l));
        if(height[l]<height[r])
            l++;
        else
            r--;
    }
    return maxArea;
}
以上的算法,因为左pointer只向右移,右pointer只向左移,直到相遇为止,所以两者相加只走过整个数组一次,时间复杂度为O(n),空间复杂度是O(1)。该算法利用了移动指针可确定的规律,做了一步贪心,实现了时间复杂度的降低。

没有评论:

发表评论