hash表
注意到只要判断数字是否重复,不用关系数字的顺序,只需要hash表存储之前遍历的,如果后续遍历已经在hash表上,就返回
var findRepeatNumber = function (nums) {
var map = {};
for(var i = 0 ; i< nums.length; i++){
if(!map[nums[i]]){
map[nums[i]] = 1;
}else {
return nums[i]
}
}
};
时间复杂度:O(n); 空间复杂度:O(n);
自身hash
注意到使用的数字都在0~n-1的范围内,因为本身nums也是一个特殊hash表,就可以使用nums这个自身的hash
思路:
-
和上面hash表一样,如果当前遍历值的不等于当前的index,就把它放入对应的位置
-
如果对应的位置上已经有了,那么当前遍历的就是答案
var findRepeatNumber = function (nums) { for (var i = 0; i < nums.length; i++) { while (i != nums[i] && nums[nums[i]] != nums[i]) { // 将对应的数字,放入对应的坑位;并且坑位上也不是正确的数字 var tmp = nums[nums[i]]; nums[nums[i]] = nums[i]; nums[i] = tmp; } if (i !== nums[i] && nums[nums[i]] == nums[i]) return nums[i]; } };
时间复杂度:O(n); 空间复杂度:O(1);