287. 寻找重复数 : 简单原地哈希运用题
原创
©著作权归作者所有:来自51CTO博客作者宫水三叶的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
这是 LeetCode 上的 287. 寻找重复数 ,难度为 中等。
Tag : 「桶排序」、「原地哈希」
给定一个包含 n + 1
个整数的数组 nums
,其数字都在
范围内(包括
和
),可知至少存在一个重复的整数。
假设 nums
只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums
且只用常量级 
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:
输入:nums = [3,1,3,4,2]
输出:3
提示:



-
nums
中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
进阶:
- 如何证明
nums
中至少存在一个重复的数字? - 你可以设计一个线性级时间复杂度

原地哈希
数组长度为
,同时给定的
都在
范围内,因此我们可以设定哈希规则为
,即数值 x
会放在下标 
如此一来,对于只出现一次的数值而言,必然能够顺利放在目标位置,而出现多次的数值必然会因为位置冲突而被找出。
Java 代码:
class Solution {
public int findDuplicate(int[] nums) {
for (int i = 0; i < nums.length; ) {
int t = nums[i], idx = t - 1;
if (nums[idx] == t) {
if (idx != i) return t;
i++;
} else {
swap(nums, idx, i);
}
}
return -1;
}
void swap(int[] nums, int i, int {
int c =
TypeScript 代码:
function findDuplicate(nums: number[]): number {
for (let i = 0; i < nums.length; ) {
const t = nums[i], idx = t - 1
if (nums[idx] == t) {
if (idx != i) return t
i++
} else {
swap(nums, i, idx)
}
}
return -1
}
function swap(nums: number[], i: number, j: number): void {
const
Python 代码:
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
n, i = len(nums), 0
while i < n:
t, idx = nums[i], nums[i] - 1
if nums[idx] == t:
if idx != i:
return t
i += 1
else:
nums[i], nums[idx] = nums[idx], nums[i]
return -1
- 时间复杂度:

- 空间复杂度:

最后
这是我们「刷穿 LeetCode」系列文章的第 No.287
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。