2018-07-31 17:28:42
问题描述:
问题求解:
很容易想到的是Brute Force,也就是枚举所有可能的pairs,这种解法的时间复杂度为O(n ^ 2),由于本题的数据规模较大,会TLE。那么就要对算法进行改进了。
这里用到的解法是Two Pointers,左右各设置一个指针,l 和 r。
首先计算最初的面积 curArea = Math.min(height[l], height[r]) * (r - l)。
如果height[l] < height[r],那么可以想见的是将右边线无论如何向左调整,都是无法继续增大面积的,因此此时只能调整左边线,l++。
同理height[l] > height[r],那么只能调整右边线来谋求更好的解,r--。
如果出现了height[l] = height[r],则可任意调整左边或者右边来谋求更好的解。
public int maxArea(int[] height) { int res = 0; int l = 0; int r = height.length - 1; while (l < r) { int curArea = Math.min(height[l], height[r]) * (r - l); if (curArea > res) res = curArea; if (height[l] < height[r]) l++; else r--; } return res; }