面试题 3.2:不修改数组找出重复的数字

在一个长度为 n+1 的数组里的所有数字都在 1~n 的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为 8 的数组 [2, 3, 5, 4, 3, 2, 6, 7],那么对应的输出是重复的数字 2 或者 3。

  • 可以创建一个长度为 n+1 的辅助数组,该方案需要 O(n) 的辅助空间。
  • 某范围里数字的个数对解决这个问题很重要。
  • 函数 countRange 将被调用 O(logn) 次,每次需要 O(n) 的时间,总时间复杂度是 O(nlogn),相当于以时间换空间。
  • 交流的重要性:面试官提出不同的功能要求或者性能要求,我们最终选取的算法也将不同。
  • 能快速、正确地实现二分查找算法的代码。

Source Code