[leetcode]11.盛最多水的容器
作者:互联网
题目地址:https://leetcode-cn.com/problems/container-with-most-water/
超时的代码
第一次看到这个题目的时候觉得超级简单,不就是两层循环套一下嘛,复杂度n2也还行的样子。然后就有了下面的代码:
public int MaxArea(int[] height)
{
int max,temp;
max = 0;
for (int i = 0; i < height.Length; i++)
{
for (int j = i; j < height.Length; j++)
{
temp = Math.Min(height[i], height[j]) * (j - i);
if (temp > max)
max = temp;
}
}
return max;
}
然后他就超时了。通过了大部分的案例,最后有几个数量特别多的测试用例导致超时。
算法分析
直接莽上去不行,考虑优化一下算法。根据题目分析,两个边界相距越远越好,而且两个边界的最小值值越大越好。所以有两种思路:1.左右两个指针从距离最远的开始,慢慢向中间靠。2.找两个最大的值,然后再找次大的值,慢慢找到最小的。由于数组是无序的,所以找最大值的时间开销也很大,最好是从最远的慢慢向内靠。
首先,左右指针指向开头和末尾,求出容量后存入max寄存器。然后长度-1,也就是有两种情况,左指针右移和右指针左移。
改进的代码
public int MaxArea(int[] height)
{
int temp=0;
int max = 0;
int left = 0;
int right=height.Length-1;
while (left < right)
{
temp = Math.Min(height[left], height[right]) * (right - left);
if (temp > max)
max = temp;
if (height[left] == height[right])
{
if (height[left + 1] > height[right - 1])
left++;
else
right--;
}
else
{
if (height[left] > height[right])
right--;
else
left++;
}
}
return max;
}
标签:11,right,temp,int,max,height,最多水,leetcode,left 来源: https://www.cnblogs.com/none323/p/15561078.html