分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
原题链接:
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左移。在这个过程中一直维护最大的那个容积。代码如下:
首先一般我们都会想到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)。该算法利用了移动指针可确定的规律,做了一步贪心,实现了时间复杂度的降低。
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow