题目:
给你 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:非常的简单,从第二个数开始,依次计算和前面的相比。
class Solution {
public:
int maxArea(vector<int>& height) {
int MaxValue=0;
int SIZE=height.size();
for(int index=1;index<SIZE;index++)
{
for(int begin=0;begin<index;begin++)
{
int temp=min(height[begin],height[index]);
{
int tempSum=temp*(index-begin);
if(MaxValue<tempSum)
MaxValue=tempSum;
}
}
}
return MaxValue;
}
};
方式2:双指针,一个在左边,一个在右边,比较左右两边的比较小的数字,然后将小的数字那边替换掉。
为什么会是这样勒?例如,左右两边的数字分别是,x y,假设x<y。间距是t 那么他们之间的水的容量是:
min(x,y)∗t=x∗t
上面的 情况是左指针的值比较小,如果左指针的值保持不变,那么右指针无论向前面移动多少,都不可能比这个值更大了。x 和y之间的最小值只能比x小,不可能比x大,同时间距只会变小,不会变大,所以总的结果是只可能变小。这个时候就要移动左指针的值了。
同理,如果是右指针的值要小,就移动右指针的值。如果左右指针指向的值一样大,那么他们可以同时移动。
有句很精辟的解释是: 每次都移动最差的一边,虽然可能变的更差,但是总比站着不动要有希望。
逃离舒适区,虽然可能会变的更差,但是有可能会变的更好~!
class Solution {
public:
int maxArea(vector<int>& height) {
int MaxValue=0;
int SIZE=height.size();
int LeftIndex=0;
int RightInde=SIZE-1;
while(LeftIndex<RightInde)
{
int tempWaterValue=min(height[LeftIndex],height[RightInde])*(RightInde-LeftIndex);
if(tempWaterValue>MaxValue)
MaxValue=tempWaterValue;
if(height[LeftIndex]<height[RightInde])
{
LeftIndex++;
}else
{
RightInde--;
}
}
return MaxValue;
}
};