# LeetCode算法学习之- 数组-[442. 数组中重复的数据]

112 阅读2分钟

题目

给你一个长度为 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

**