代码之家  ›  专栏  ›  技术社区  ›  Afroman

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

  •  1
  • Afroman  · 技术社区  · 8 年前

    所以在一次网上采访中,我被要求解决这个问题,但失败了。我立即被拒绝了。 我试图找出我的算法出了什么问题。

    两个最大的数字

    用您选择的编程语言编写一个函数,该函数接受整数数组并返回前两个最大数的索引。记录边缘案例周围的任何特殊行为(如果有)。该函数的运行时间应为 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};
    }
    

    关于记录边缘案例的特殊行为,我得到了以下回复:

    对于数字为负数的情况,high和second high变量已初始化为min int value,而不是默认值零。 复杂性是 O(N) .

    我哪里出错了?我知道时间复杂度是 O(N) 因为我在遍历整个列表,空间复杂度是 O(1) 因为high和second high变量的空间较小(固定)。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Sergey Kalinichenko    8 年前

    注释是一种间接的方式,表示您的代码将因任何非空输入而崩溃,因为在初始迭代期间 numbers[high] 将相当于引用 numbers[int.MinValue] .

    注释建议将这两个值初始化为 0 . 我认为您可以更进一步,将值初始化为 0 1 或者 1. 0 ,这取决于两个初始数字中哪个更大。之后,您将从索引开始迭代 2 . 当然,您需要确保数组至少有两个元素。

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