Leetcode–11. 盛最多水的容器 [2020.9.10]
前言
这题其实还是比较简单的题目,只要思路正确,很快就能解出来。
首先易知,对于两个长短不同的木板,其所能盛水的最大面积由最短的木板决定,即
h
e
i
g
h
t
[
m
i
n
]
∗
(
m
−
n
)
height[min]*(m-n)
height[min]∗(m−n)。我们可以从所有木板的最左和最右开始,分别设立左右指针。初始面积为
h
e
i
g
h
t
[
m
i
n
]
∗
(
m
−
n
)
height[min]*(m-n)
height[min]∗(m−n),随后我们找到最短的木板,向内移动对应的指针。
为什么要移动最短木板方的指针,这是因为盛水的面积由最短的木板决定,向内移动可能会遇到更高的木板,那么盛水的面积就会增加。如果移动的是最长的木板,即使遇到更长的木板,对盛水面积也没有变化。所以有:
1. 向内移动短木板,盛水面积可能变大。
2. 向内移动长木板,面积必然不会变大。
所以我们不停向内移动左右指针直到相遇,记录中间最大的面积,便是我们最后的答案。
问题
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int l=0,r=n-1;
int area=0,maxarea=0;
while(l<r){
if(height[l]<height[r]){
area = height[l]*(r-l);
l++;
}
else{
area = height[r]*(r-l);
r--;
}
if(area>maxarea)
maxarea = area;
}
return maxarea;
}
};
附录
最大盛水面积由短木板决定。