11. 盛最多水的容器
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
想法1:暴力解法
1.二维数组res[x][y]表示第x个元素与第y个元素组成容器的容量
2.res[x][y]=min(height[x],height[y])*(|x-y|)
3.去res数组的最大值。
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int len = height.size() ;
int res = 0 ;
// int x = 0 ;
for (int i = 0 ; i < len ; i++)
for (int j = i+1 ; j < len ; j++){
int x = height[i] < height[j] ? height[i] : height[j] ;
x = x*(j - i) ;
if (x>res){
// cout<<x<<" "<<j<<" "<<i<<endl ;
res = x ;
}
}
return res ;
}
};
题解:双指针法
1.设置收尾指针h和r 并计算h和r位置元素构成矩形的面积;
2.移动较小的元素指针,并计算h和r位置元素构成矩形的面积;
3.循环上述操作至h = r 并更新最大面积;
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int h = 0 ;
int r = height.size() - 1 ;
int res = 0 ;
while (h != r){
int x = height[h] > height[r] ? height[r] : height[h] ;
x = x * (r - h );
if (res < x){
res = x ;
}
height[h] > height[r] ? r-- : h++ ;
}
return res ;
}
};