题目链接
解法——双指针扫描( O ( n ) O(n) O(n))
这道题的思路来源于生活中的一个常识:木桶短板理论,即一个木桶盛水的多少是由它最短的那条木板决定的。
回到这道题,假设现在左右两条边(“木板”)的长度分别为height[i]
和height[j]
,那么此时容器盛水的多少由height[i]
和height[j]
较小的那一个决定,不妨令较短边为height[i]
。所以,当我们移动j
时,这个容器的盛水量绝不可能增加,只能移动i
来寻找更大的height[i]
,即增加短边,进而增大盛水量。
所以我们的具体策略是,定义两个指针i
和j
,初始时分别指向首尾。如果
h
e
i
g
h
t
[
i
]
>
h
e
i
g
h
t
[
j
]
height[i]>height[j]
height[i]>height[j],则
j
−
−
j--
j−−,否则
i
+
+
i++
i++,直到两指针会面
i
=
j
i=j
i=j为止。扫描过程中,每次更新一次最大盛水量。
两个指针总共扫描 n n n次,因此时间复杂度为 O ( n ) O(n) O(n)。 代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
for (int i = 0, j = height.size() - 1; i < j;) {
res = max(res, min(height[i], height[j]) * (j - i));
if (height[i] > height[j]) j--;
else i++;
}
return res;
}
};