1. 问题背景与核心挑战
- 寻找重复数是LeetCode经典题库中的一道中等难度题目,它考察的是对数组操作和算法优化的理解。题目描述看似简单:给定一个长度为n+1的数组,所有元素都在1到n之间(包含边界),其中至少有一个重复数字。要求找出这个重复的数字,且不能修改原数组(即不能排序)、空间复杂度需控制在O(1)。
这道题的特殊之处在于它设置了多个限制条件:
- 不能修改原数组排除了排序后遍历的常规解法
- 空间复杂度O(1)排除了使用哈希表记录出现次数的方案
- 时间复杂度需要优于O(n²)才可能通过大规模测试用例
在实际面试中,这道题经常被用来考察候选人对"龟兔赛跑"算法(Floyd's Cycle Detection)的理解和应用能力。我在多次面试复盘和刷题过程中发现,能够灵活运用该算法的候选人往往在系统设计环节也表现出更强的逻辑思维能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与常规思路分析
2.1 直观暴力解法
最直接的思路是双重循环遍历数组:
python复制def findDuplicate(nums):
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] == nums[j]:
return nums[i]
这种解法时间复杂度O(n²),在LeetCode上会超时,仅作为理解问题的起点。
2.2 哈希表解法
使用集合记录已出现的数字:
python复制def findDuplicate(nums):
seen = set()
for num in nums:
if num in seen:
return num
seen.add(num)
时间复杂度O(n),但空间复杂度O(n),不符合题目要求。这个解法虽然不能作为最终答案,但在实际工程中是最常用且可靠的方案。
2.3 排序解法
先排序再查找相邻相同元素:
python复制def findDuplicate(nums):
nums.sort()
for i in range(1, len(
