剑指offer--数组查重

165 阅读1分钟

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

思路:

  1. 和上面hash表一样,如果当前遍历值的不等于当前的index,就把它放入对应的位置

  2. 如果对应的位置上已经有了,那么当前遍历的就是答案

     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);