数组中重复的数据

简介: 🎈每天进行一道算法题目练习,今天的题目是“数组中重复的数据”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“数组中重复的数据”。

问题描述

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

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

示例 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 <= 10^5
1 <= nums[i] <= n
nums 中的每个元素出现 一次 或 两次

思路分析

阅读完题目后我们知道,题目是要我们找出数组中所有出现了两次的元素。\
这样看来题目好像十分简单,我们直接来两个for循环就可以暴力求出题目的答案了,但是真的这么简单吗?让我们再来好好看一遍题目,我们会找到这么一个要求限制你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题,也就是说我们只能进行一次循环来求解,这样一来是不是就有一点挑战性了?那么接下来就让我们一起来思考该如何完成这一道题目。
我们可以将数字和下标对应起来,如数字4应该放在下标3的位置,我们只需要将对应下标的位置上都放入对应的数字,最后我们只需要在判断数字是否在其对应下标和其他位置同时出现即可,关键代码如下:

  • 1、数组元素位置交换
const swap = function(nums,ind1,ind2){
    [nums[ind1],nums[ind2]] = [nums[ind2],nums[ind1]];
}
  • 2、将数组元素交换到指定下标
for(let i = 0; i < nums.length; i++){
    while(nums[nums[i] - 1] != nums[i]) swap(nums,i,nums[i] - 1);
}
  • 3、找出重复的数字
for(let i = 0; i < nums.length; i++){
    if(nums[i] == i + 1) continue;
    if(nums[nums[i] - 1] == nums[i]) res.push(nums[i]);
}

AC代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
 var findDuplicates = function(nums) {
     const swap = function(nums,ind1,ind2){
         [nums[ind1],nums[ind2]] = [nums[ind2],nums[ind1]];
     }
     const res = [];
     for(let i = 0; i < nums.length; i++){
         while(nums[nums[i] - 1] != nums[i]) swap(nums,i,nums[i] - 1);
     }
     for(let i = 0; i < nums.length; i++){
        if(nums[i] == i + 1) continue;
        if(nums[nums[i] - 1] == nums[i]) res.push(nums[i]);
     }
     return res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
1月前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
|
1月前
|
算法 测试技术 C#
【哈希映射】【 哈希集合】 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
【哈希映射】【 哈希集合】 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
|
5月前
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
判断两个不重复的list集合是否相等 只比较元素值 不比较顺序
26 0
|
6月前
442. 数组中重复的数据
442. 数组中重复的数据
|
7月前
删除数组中重复出现的值
删除数组中重复出现的值
47 0
|
9月前
|
算法
LeetCode-442 数组中重复的数据
LeetCode-442 数组中重复的数据
|
算法
LeetCode——442. 数组中重复的数据
LeetCode——442. 数组中重复的数据
67 0
|
算法 Go
算法练习第十题——寻找重复数(不修改数组)
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
|
存储 算法 JavaScript
寻找数组中的重复数字
寻找数组中的重复数字
寻找数组中的重复数字