题目

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

思考

排序,从头扫描,时间复杂度为01-数组中重复的数字 - 图1

哈希表。遍历所有数字,如果这个数字没有在表中,加入表;如果在表中,则找到重复数字。时间复杂度和空间复杂度都是01-数组中重复的数字 - 图2

考虑in-place方法,空间复杂度是01-数组中重复的数字 - 图3,时间复杂度01-数组中重复的数字 - 图4
——下标定位元素

  • 从头到尾扫描这个数组中的每个数字;
  • 扫描到下标为i的数字m时:
    • 这个数字m == i,扫描下一个数字;
    • 如果m != i,
      • 把m放在属于他的位置上
      • 原本属于他的位置和m相等,则m是重复数字

代码

  1. def duplicate(nums: List[int]):
  2. for i, num in enumerate(nums):
  3. while i != nums[i]:
  4. # 交换num[nums[i]], num[i]
  5. if nums[i] != nums[nums[i]]:
  6. temp = nums[i]
  7. nums[i] = nums[temp]
  8. nums[temp] = temp
  9. # print(nums)
  10. else:
  11. return num