简要: 给你一个长度为 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;
};