Container With Most Water
Solution 1
刚看到题目和数据范围,本以为暴力算法(遍历所有的结果)时间是够的,但是还是TLE了。因此这个题只能使用贪心算法了。
本题贪心的核心思路就是:每一次寻找面积都尽可能往大了搜,在本题中,更大的值需要一个更大的“较矮边”,因此遍历的过程就是尽可能找“可能更大的较矮边”。使用双指针分别维护两个边,然后向内收缩的时候,优先收缩较矮的一边,因为这样能够期望找到可能更大的一条较矮边,从而可能获得更大的面积,并且能够防止漏解。
这里贪心最优的证明省略了,不过从中间向外扩张也是可以的,只是收缩比较符合普遍的双指针维护的算法。
- 时间复杂度: O ( n ) O(n) O(n), n n n为序列长度
- 空间复杂度: O ( 1 ) O(1) O(1)
class Solution {
public:
int maxArea(vector<int>& height) {
int ans = 0;
int head = 0, tail = height.size() - 1;
while (head <= tail) {
ans = max(ans, (tail - head) * min (height[head], height[tail]));
if (height[head] > height[tail]) {
tail --;
}
else {
head ++;
}
}
return ans;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def maxArea(self, height: List[int]) -> int:
ans = 0
head = 0
tail = len(height) - 1
while head < tail:
ans = max(ans, (tail - head) * min(height[head], height[tail]))
if height[head] > height[tail] :
tail -= 1
else :
head += 1
return ans