题目
思路一:
以height作为标准排序,之后从后往前扫,把当前当做矮的木板,而且由于排序,在他之后的木板都比他高,所以只需要实时记录两个值,最大和最小的位置,再与当前值计算水的体积即可
class Solution {
public:
struct Line{
int num;
int m_height;
bool operator < (const Line&L){
return m_height<L.m_height;
}
}line[101000];
int maxArea(vector<int>& height) {
int n=height.size();
for(int i=0;i<n;i++){
line[i].num=i;
line[i].m_height=height[i];
}
sort(line,line+n);
int maxnumID=n-1,minnumID=n-1,ans=-1;
for(int i=n-2;i>=0;i--){
ans=max(ans,abs(line[i].num-line[maxnumID].num)*line[i].m_height);
ans=max(ans,abs(line[i].num-line[minnumID].num)*line[i].m_height);
if(line[i].num<line[minnumID].num)minnumID=i;
if(line[i].num>line[maxnumID].num)maxnumID=i;
}
return ans;
}
};
思路二:
两个指针,一个最左,一个最后,把他们当做两端的木板,我们可以思考一下,这两块木板中,矮的那块已经不会有比当前更优的选择了,所以,我们要把矮的那一块的指针移动,指导指针相遇,实时更新水的体积即可。
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int mmax=0;
for(int i=0,j=n-1;i<j;){
mmax=max(mmax,min(height[i],height[j])*(j-i));
if(height[i]<=height[j])i++;
else j--;
}
return mmax;
}
};