leetcode_442. 数组中重复的数据

79 阅读1分钟

题目链接点击此处

简要: 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

看到这个题目第一个思路是:将该数组从1到n遍历一次,剔除掉从1到n的所有数,剩下的就是重复的数。代码如下:

function findDuplicates(nums: number[]): number[] { 
    let len:number = nums.length; 
    for(let i:number = 1; i <= len; i++) { 
        let index:number = nums.indexOf(i); 
        if(index != -1) { 
            nums.splice(index, 1); 
        } 
    } 
    return nums; 
};

写的很好,就是超时了。于是马上就有了另个一思路,用空间换时间。用一个数组来存该数组从1到n的数,如果这个数组已经存过值,说明该数字重复了。用数组索引的方式查找很快,就不会超时,但是需要一个数组的空间来存储。代码如下:

function findDuplicates(nums: number[]): number[] {
    let len:number = nums.length;
    let arr: Array<number> = new Array<number>(len);
    let i:number = 0;
    for(; i < len; i++) {
        arr[i] = 0;
    }

    let result: Array<number> = new Array<number>();
    for(let i:number = 0; i < len; i++) {
        if(arr[nums[i] - 1] != 0) {
            result.push(nums[i]);
        } else {
            arr[nums[i] - 1] = nums[i]; 
        }
    }

    return result;
};