题目:
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:
你不能倾斜容器,且 n 的值至少为 2。
输入数据:
[1,8,6,2,5,4,8,3,7]
[1,1,2,1,5,6,3,5,10,6,9]
[1,1,1,1,1,1,1]
输出数据:
49
30
6
算法实现:
int maxArea(vector<int>& height) { // 输入一个数组
int maxArea = 0; //定义变量存储最大面积
int temp = 0; //定义变量临时存储计算所得面积
int r = 0,l = height.size()-1; //定义变量分别指向数组的首元素和尾元素
while(r < l){ //当尾元素下标小于等于首元素下标时,说明遍历求解了所有可能的取值,跳出循环
if(height[r]<height[l]){ //判断首尾元素哪一个更小,小的作为矩形的高,首尾下标之差作为长,高和长的乘积是盛水的多少,赋值给临时面积变量
temp = height[r]*(l-r);
r++; //首元素小的,下标加1
}else{
temp = height[l]*(l-r);
l--; //尾元素小的,下标减1
}
if( maxArea<temp){ //比较当前存储的最大面积和最近计算出来的面积,如果后者更大,则更新最大面积为最近计算出来的数值
maxArea = temp;
}
}
return maxArea; //返回双指针法遍历数组计算出来最大面积,问题解决
}