题目:
在一个长度为 n
的数组 nums
里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:
示例一:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
思路
这道题目只要做过类似的用哈希表的题目,就很容易想到思路,典型的空间换时间。遍历一遍数组,将每个遍历到的数字都记录在一个哈希表中。这个哈希表中的每一个键代表当前已经遍历过的一个数字,当遍历到一个哈希表中存在的数字时,就说明这个数字重复了,返回它。这种方法的空间复杂度是 O(2n),而时间复杂度只有 O(n)。
如果不用哈希表记录的话,对于每一个数字,都遍历一遍数组,查看是否有与之相等的数字。这样的时间复杂度是 O(n^2),空间复杂度是 O(n)。明显使用空间换时间很划算。
代码
function findRepeatNumber(nums: number[]): number {
const map = new Map();
for(let i=0; i<nums.length; i++){
const num = nums[i];
if(map.has(num)){
return num
} else {
map.set(num, 1);
}
}
return -1;
};