11.Container With Most Water
题目:
LeetCode:11. Container With Most Water
描述:
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n
vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
- 从已有的数组中,选找两个线段使得他能构成最大的盛水容器。
- 盛水容器,根据生活常识,容量取决于最短的那条边;
- 盛水容量为:S = a(长) * b(宽) = min(i , j) * (j - i ); // i,j 为当前选择的线段索引值;
分析:
1.暴力枚举
// 思路;
1、最暴力的方式就像遍历这个数组,计算任意两个组合的线段组成的面积大小,不可取;
2、利用左右两边逼夹的方式,向中间运动,记录此时的面积,取最大值。
3、移动时选择较小的边进行移动,并更新记录的两条线段索引。
代码:
int maxArea(vector<int>& height) {
int nMax = 0;
int nLeft = 0;
int nRight = height.size() - 1;
for (; nLeft < nRight;)
{
nMax = max(nMax, min(height[nLeft], height[nRight]) * (nRight - nLeft));
if (height[nLeft] > height[nRight])
{
--nRight;
}
else
{
++nLeft;
}
}
return nMax;
}
备注:
可以参考nomasp的解析