yxc题解(证明要懂) 证明看yxc题解(公式证明)
其他题解1:
问题:
y总最后的为啥是min(ai,aj′)∗(j′−i)=S’
?不是min(ai’, aj’)*(j’-i’)=S’
吗?回答:
这句话:“ 不妨设i先走到i’ ”,此时i和i’是一样的。
是先固定下左边的指针再去考虑右边的性质吧,如果两个指针都在动应该很难想到做法
做法:用两个指针 i
,j
分别指向首尾,如果 ai>aj
,则 j−−
;否则 i++
,直到 i=j
为止,每次迭代更新最大值。
时间复杂度分析:两个指针总共扫描 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;
}
};
暴力做法:$O(N^2)$
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
for (int i = 0; i < height.size(); i ++) {
for (int j = i + 1; j < height.size(); j ++)
res = max(res, min(height[i], height[j]) * (j - i));
}
return res;
}
};