测试用例:
- 长度为n的数组里包含一个或者多个重复的数字
- 数组中不包含重复的数字
- 无效输入测试用例(输入空数组;长度为n的数组中包含0~n-1之外的数字)
解决思路一
先排序:使用数组的sort(fun)方法,注意对数字排序需要自己写一下fun方法。
从头到尾扫描排序后的数组。若相邻两个数相同,则该数组中有重复的数字。
function findReNumber(arr) {
if(arr.length == 0){
return false;
}
arr.every(function(x){
return x>=0 && x<arr.length;
})
arr.sort(function(a,b){
return (a-b);
});
for(var i = 0; i<arr.length-1;i++){
if(arr[i]===arr[i+1]){
return true;
}
}
return false;
}
解决思路二
利用哈希表。使用Set可以达到目的。
遍历,每遍历到一个数字的时候如果表中没有这个数字,则加入;如果有这个数字,则表明重复。
算法的时间复杂度为O(n),但是它提高时间效率是以一个大小为O(1)的哈希表为代价的。
function findReNumber(arr) {
if(arr.length == 0){
return false;
}
arr.every(function(x){
return x>=0 && x<arr.length;
})
var set = new Set();
for(var i=0; i<arr.length;i++){
if(set.has(arr[i]))
return true;
else
set.add(arr[i]);
}
return false;
}
解决思路三
重排数组的方法,能够实现时间复杂度为O(n),空间复杂度为O(1)
const findDuplicate = (arr,length) => {
if(arr=null||length<=0)
return false;
for(let val of arr){
if(var<0 || var>n-1)
return false;
}
for(let i = 0; i < length; i++){
while(arr[i]!=i){
if(arr[i]==arr[arr[i]]){
return true;
}else{
[arr[i],arr[arr[i]] = [arr[arr[i], arr[i]];
}
}
}
return false;
}