题目:
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-duplicates-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例2:
输入:nums = [1,1,2]
输出:[1]
示例3:
输入:nums = [1]
输出:[]
提示:
· n == nums.length
· 1 <= n <= 105
· 1 <= nums[i] <= n
· nums 中的每个元素出现 一次 或 两次
解法一:
用一个set容器辅助判断。遍历数组nums,如果set中没有对应元素,则将其添加到set中;如果set中已经存在该元素,则说明重复了,将其存入新数组。
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDuplicates = function(nums) {
const set = new Set();
const res = [];
for(let i = 0, len = nums.length; i < len; i++) {
if (set.has(nums[i])) {
res.push(nums[i]);
} else {
set.add(nums[i]);
}
}
return res;
};
解法二:
使用includes(),遍历数组,对遇到的数值取反。如果数组中存在对应数的相反数,则说明该元素在数组中出现过。(注意:使用includes()时间复杂度达到了O(n2),不划算,建议使用方法一)
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDuplicates = function(nums) {
const res = [];
for (let i = 0, len = nums.length; i < len; i++) {
if (nums.includes(-nums[i])) {
res.push(nums[i]);
} else {
nums[i] = -nums[i];
}
}
return res;
};