题目
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
分析
\1. 都在【1,n】 => index =nums[i]-1
\2. 出现一次 or 两次=》 余数+ 出现一次+n
\3. 不添加额外空间 =》 就在原数组上修改
解法:数组统计
思想
1. 因为不添加额外空间 所以就在原数组上修改
2. 因为取值在[1,n]Index =nums[i]-1, 所以可以利用余数++的方式来做
3. 当Nums[i]>2*n的时候说明加了2次n,所以肯定出现过2次的值
注意
1. 有种特殊情况 【1】or [2,2] 这种情况就会是只 加一次也等于 2*n =》 必须是》2*n
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDuplicates = function (nums) {
const n = nums.length;
const res = [];
// 在原数组上修改,因为index=nums[i]-1 所以在nums[index%n]的数上加n
for (let i = 0; i < nums.length; i++) {
const key = nums[i];
const x = (key - 1) % n;
nums[x] += n;
}
// 再次遍历数组如果 大于2*n 则肯定出现了2次
for (let i = 0; i < nums.length; i++) {
if (nums[i] > 2 * n) {
res.push(i + 1);
}
}
return res;
};
//时间复杂度:O(n)
//空间复杂度:O(1)
总结
今天这道题是主要是练习如何使用余数的方式在原数组上修改 求出现了多少频次的元素
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
**