标签:11 right temp int max height 最多水 leetcode left
题目地址: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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。