难度:简单
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
解题思路:
我用了三种方法来解题:哈希表,排序查重,原数组上改动
这三种方法也是书上提到的,虽然书上是c++语言的,但是像这种算法题,解题思路都是相通的
JavaScript解法:
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
// 方法一:借助集合 时间100ms 内存45.5M
// const map=new Set();
// map.add(nums[0]);
// for(let i=1;i<nums.length;i++){
// if(map.has(nums[i])){
// return nums[i];
// }else{
// map.add(nums[i]);
// }
// }
//方法二:空间复杂度为o(1), 在原数组上交换元素,使得每个index的值正好是元素值,若哪个元素值已经排好了,就返回
//时间92ms 内存43.2M
for(let i=0;i<nums.length;i++){
if(i===nums[i]){
}else{
if(nums[nums[i]]===nums[i]){
return nums[i];
}
// console.log(nums[i]);
let t=nums[i];
nums[i]=nums[nums[i]];
// console.log(nums[i])
nums[t]=t;//这里会搞错,因为nums[i]的值已经变掉了,不能写nums[nums[i]]
i--;
}
// console.log(nums)
}
//方法三:排序之后遍历一遍 时间116ms 内存44.1M
// nums.sort((a,b)=>{
// return a-b;
// });
// for(let i=1;i<nums.length;i++){
// if(nums[i-1]===nums[i]){
// return nums[i];
// }
// }
};