题目
剑指 Offer 03. 数组中重复的数字
难度简单471
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
解题思路
既然所有数字都在0-n-1范围内,那么我们可以大气点直接开辟一个100000的数组,每个数字对应下标用来记录它出现的次数,有一个达到2时即可以返回(因为题目要求的是任意一个重复数字
时间复杂度O(n) 空间复杂度O(n)
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
//以空间换取时间
let arr = Array(100000).fill(0);
for(let i=0;i<nums.length;i++){
arr[nums[i]]++;
if(arr[nums[i]]>=2) return nums[i];
}
};
另外我们也可以先排序,然后在从前往后遍历,遇到的第一个和下一个相等的数就是重复的数
时间复杂度O(nlogn) 空间复杂度O(1)
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
nums = nums.sort((a,b)=>{
return a-b;//小的放前面
});
for(let i=0;i<nums.length-1;++i){
if(nums[i]==nums[i+1]) return nums[i];
}
};
或者我们可以使用原地交换的方式来解决该题目
让每一个数回到对应下标的位置,若对应下标已将为该数则表示重复
时间复杂度O(n) 空间复杂度O(1)
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
for(let i=0;i<nums.length;++i){
while(i!=nums[i]){
//说明当前数和它要放的位置的数一样,即重复了
if(nums[i]==nums[nums[i]]) return nums[i];
let temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
/*
注意不要写成这样
let temp = nums[i];
nums[i] = nums[nums[i]];//从这里考试nums[i]就改变了
nums[nums[i]] = temp;
*/
}
}
};