所以我被要求在网上采访中解决这个问题并且失败了。我立刻被拒绝了。 我想弄清楚我的算法出了什么问题。
两个最大的数字
在您选择的编程语言中编写一个函数,该函数接受一个整数数组并返回前两个最大数字的索引。记录边缘情况下的任何特殊行为(如果有)。该函数的运行时间应为
O(N)
,其中N是数组的长度,O(1)
是额外的空间。
我写了这个方法来对C#中的数字进行排序:
int[] sortArrayIndicies(int[] numbers)
{
int high = int.MinValue;
int secondHigh = int.MinValue;
for(int i = 0; i < numbers.Length; i++)
{
if (numbers[i] > numbers[high])
{
secondHigh = high;
high = i;
}
else if (numbers[i] > numbers[secondHigh])
{
secondHigh = i;
}
}
return new[] {high, secondHigh};
}
至于记录边缘情况的特殊行为,我得到了以下答复:
对于数字为负数的情况,高和第二高变量已初始化为min int值而不是默认值零。 复杂性为
O(N)
。
我哪里出错了?我知道时间复杂度为O(N)
,因为我在整个列表中进行迭代,空间复杂度为O(1)
,因为高和第二高变量的空间量很小(固定)。
答案 0 :(得分:3)
注释是间接表示您的代码将针对任何非空输入崩溃,因为在初始迭代期间1 x Bruit (U) BUX1_T10963
2 x Bruit (U) BUX1_T10963
2 x Bruit (U) BUX1_T10963
1 x Bruit (U) BUX1_T10964
2 x Bruit (U) BUX1_T10964
2 x Bruit (U) BUX1_T10964
2 x Bruit (U) BUX1_T10964
2 x Bruit (U) BUX1_T10964
NA BUX1_T10964
NA BUX1_T10964
NA BUX1_T10964
NA BUX1_T10964
1 x TAMAN (M) BUX1_T10965
2 x TAMAN (M) BUX1_T10965
1 x Bruit (U) BUX1_T10965
1 x TAMAN (M) BUX1_T10965
1 x Bruit (U) BUX1_T10965
2 x TAMAN (M) BUX1_T10965
将等同于引用numbers[high]
。< / p>
评论建议您将这两个值初始化为numbers[int.MinValue]
。我认为您可以更进一步,并将值初始化为0
和0
或1
和1
,具体取决于两个初始数字中的哪一个更大。之后,您将开始从索引0
进行迭代。当然,您需要确保该数组至少包含两个元素。
您的计划应考虑的另一个特殊情况是两个最大的数字彼此相等,如2
。在这种情况下,{1, 2, 5, 3, 4, 5, 4, 3}
和high
都具有相同的值,因此您的程序应返回secondHigh
。