面试题 3.1:找出数组中重复的数字

在一个长度为 n 的数组里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 [2, 3, 1, 0, 2, 5, 3],那么对应的输出是重复的数字 2 或者 3。

  • 排序一个长度为 n 的数组需要 O(nlogn) 的时间。
  • 利用哈希表可以实现时间复杂度为 O(n) 的算法,但代价是一个空间复杂度为 O(n) 的哈希表。
  • 重复数字通过指针,传递给函数的调用者。
  • 尽管有一个两重循环,但每个数字最多只要交换两次就能找到属于它自己的位置,故时间复杂度是 O(n)。
  • 一维数组在内存中占据连续的空间,可以根据下标定位对应的元素。
  • 问题比较复杂时,关键是能否通过具体的例子找出其中的规律。

Source Code