容器的底:两个元素的距离
容器的高:两个元素最小的一个
条件:找到底*高的最大值
代码1暴力循环:超出时间限制
class Solution {
public:
int maxArea(vector<int>& height) {
int len = height.size();
int area = 0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
int dis = j-i;
int high=min(height[i],height[j]);
area = dis*high > area ? dis*high:area;
}
}
return area;
}
};
代码2采用双指针法,降低复杂度;左右指针分别从两端开始遍历,每次数值小的那一个往中间移动,面积每增加时更新,两个指针相遇的时候停止遍历。
class Solution {
public:
int maxArea(vector<int>& height) {
int len = height.size();
int area = 0;
int left = 0;
int right = height.size()-1;
while(left<right)//?不可以相等
{
int h = min(height[right],height[left]);
int d = right-left;
// area = h*d > area ? h*d : area;
area = max(h*d,area);
if(height[right]<height[left]){
right--;
}
else{
left++;
}
}
return area;
}
};