题目为 给你 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
我的第一种解法为暴力算法,很简单循环直接算,破水桶效应取最短的边。
public static int MaxAreaOld(int[] height)
{
int MaxPool = 0;
int MaxRight = 0;
int length = height.Length;
int R = length;
for (int i = 0; i < length; i++)
{
MaxRight = 0;
for (int j = length - 1; j > i; j--)
{
if (height[j]>MaxRight)
{
int shortNum = height[j] > height[i] ? height[i] : height[j];
int newMax = (j - i) * shortNum;
if (MaxPool < newMax)
{
MaxPool = newMax;
MaxRight = height[j];
}
}
}
}
return MaxPool;
}
第二种算法是从最外边向内算结果。比较两个最外边,将最小的那个边向内移动,计算最长的面积。代码如下
public int MaxArea(int[] height)
{
int MaxPool = 0;
int length = height.Length;
int left=0,right = length - 1;
while (left!=right)
{
int wid = right - left;
MaxPool = Math.Max(MaxPool, Math.Min(height[right], height[left]) * wid);
_=height[left] > height[right] ? right-- : left++;
}
return MaxPool;
}
我的第二种方法的代码已经尽力优化到最好了,但是用时只超过了百分之七十,真的想看看那些双百的代码是如何优化执行速度的。