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