编写一个函数来查找前两个最大数字的索引

时间:2017-11-22 16:51:58

标签: algorithm time-complexity big-o

所以我被要求在网上采访中解决这个问题并且失败了。我立刻被拒绝了。 我想弄清楚我的算法出了什么问题。

  

两个最大的数字

     

在您选择的编程语言中编写一个函数,该函数接受一个整数数组并返回前两个最大数字的索引。记录边缘情况下的任何特殊行为(如果有)。该函数的运行时间应为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),因为高和第二高变量的空间量很小(固定)。

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]。我认为您可以更进一步,并将值初始化为0011,具体取决于两个初始数字中的哪一个更大。之后,您将开始从索引0进行迭代。当然,您需要确保该数组至少包含两个元素。

您的计划应考虑的另一个特殊情况是两个最大的数字彼此相等,如2。在这种情况下,{1, 2, 5, 3, 4, 5, 4, 3}high都具有相同的值,因此您的程序应返回secondHigh