给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7] 输出: 49
int Solution::maxArea(vector<int>& height)
{
/**
*解法一:暴力法遍历所有的组合
*
*/
vector<int> AllArea;
int per_area;
int max_area = 0;
for (int i = 0; i < height.size(); ++i)
{
for (int j = i + 1; j < height.size(); ++j)
{
if (height[i] <= height[j])
{
per_area = height[i] * (j - i);
AllArea.push_back(per_area);
}
else
{
per_area = height[j] * (j - i);
AllArea.push_back(per_area);
}
}
}
for (int k = 0; k < AllArea.size(); ++k)
{
if (AllArea[k] >= max_area) max_area = AllArea[k];
}
cout << max_area << endl;
return max_area;
}
int Solution::easy_maxArea(vector<int>& height)
{
/**
* 解法二:
* 两个指针,L指针指向数组最左侧,R指针指向数组最右侧。
* 1、比较两个指针的值,对于元素较小的那个值,此时有关于它的最大面积。
*(此时,无论从数组的其它任何地方指向这个较小值,
* 所得到的面积都将小于此时保存的面积)。
* 2、将这个较小的元素舍弃。
* 3、这时又得到一个新的最宽的容器,重复上述操作。
* 4、得到一系列最大的值。
* 5、比较得出最后结果。
*/
int L = 0;
int R = height.size() - 1;
int max_area = 0;
int per_area = 0;
//vector<int> vec_max_area;
//per_area = (L*(R - L) > R*(R - L)) ? L*(R - L) : R*(R - L);
while (R != L)
{
if (height[L] > height[R])
{
per_area = height[R] * (R - L);
max_area = (per_area > max_area) ? per_area : max_area;
//vec_max_area.push_back(per_area);
--R;
}
else
{
per_area = height[L] * (R - L);
max_area = (per_area > max_area) ? per_area : max_area;
//vec_max_area.push_back(per_area);
++L;
}
}
cout << "简单函数的求解是:" << max_area << endl;
return max_area;
}