双指针+贪心
盛水的面积 = 长度
×
\times
× 左右柱子最低高度
a
r
e
a
=
(
r
−
l
)
×
m
i
n
(
h
e
i
g
h
t
[
l
]
,
h
e
i
g
h
t
[
r
]
)
area = (r-l)\times min(height[l],height[r])
area=(r−l)×min(height[l],height[r])
初始时,我们不知道每个柱子的高度,但是我们可以选取最左侧柱子和最右侧柱子,使得
(
r
−
l
)
(r-l)
(r−l) 最大。乘数的另一项,取决于左右柱子的最低值,选取左右柱子较低的那一根,向中间移动,移动时
(
r
−
l
)
(r-l)
(r−l) 减小,
m
i
n
(
h
e
i
g
h
t
[
l
]
,
h
e
i
g
h
t
[
r
]
)
min(height[l],height[r])
min(height[l],height[r]) 可能增大,也就是
a
r
e
a
area
area 可能增大。这是本题的贪心思路。
代码展示
class Solution {
public:
int maxArea(vector<int>& height) {
int ans = 0;
for(int l = 0,r = height.size()-1;l<r;){
int area = min(height[r],height[l]) * (r-l);
ans = max(ans,area);
if(height[l]<height[r]) l++;
else r--;
}
return ans;
}
};
时间复杂度 O ( n ) O(n) O(n) , n n n 是柱子的数量,最多遍历一次找到最大面积,时间复杂度 O ( n ) O(n) O(n)。
空间复杂度 O ( 1 ) O(1) O(1) , 除若干变量使用的常量级空间,没有使用额外的线性空间 。
博主致语
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。