要求
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
示例
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
代码
- 暴力法:在所有可能性中选择符合要求的
int maxArea(vector<int>& height) {
int max = 0,i,j,v,h;
int n = height.size();
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
h = height[i]>height[j]?height[j]:height[i];
v = h*(j-i);
max = v>max?v:max;
}
}
return max;
}
- 双指针法
int maxArea(vector<int>& height) {
int max=0,i=0,j,v;
j = height.size()-1; //最后一个元素的位置应该在个数减1.
while(i<j)
{
int h = height[i]<height[j]?height[i]:height[j];
v = h*(j-i);
max = max>v?max:v;
if(height[i]<height[j]) i++; //朝边较短的一向移动
else j--;
}
return max;
}
评价
- 此题就是个数学问题。矩形区域的面积是取决于较短的那一条边的,所有在把矩形向中间压缩的过程中,底是变短的,所有只能移动较短的一条边,才有可能形成底变短,高变长,最后面积变大的情况。
版权声明:本文为Dreamer_rx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。