力扣442. 数组中重复的数据

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

力扣442. 数组中重复的数据

一、题目描述:

给你一个长度为 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 中的每个元素出现 一次 或 两次

来源:力扣(LeetCode) 链接:leetcode.cn/problems/fi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目的难度在于以O(n)的时间复杂度来完成这道题目,如果没有这个要求,可以暴力解决。

    那么如果是O(n)的时间复杂度,我们应该怎样解决这道题目呢?

    因为数组有n个数,数的范围为1到n。且每个整数是出现一次或两次。

    所以我们可以通过将每个数放在对应的位置上,即他们的值减1的位置上。

    最后统计有几个值不在位置上即可知道哪些值出现了两次。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    这个方法真的妙极了!真是妙蛙种子吃着妙脆角妙进了米奇妙妙屋,妙到家了。

    image-20220526155846758

三、AC 代码:

 int* findDuplicates(int* nums, int numsSize, int* returnSize) {
     for (int i = 0; i < numsSize; ++i) {
         while (nums[i] != nums[nums[i] - 1]) {
             int temp = nums[i];
             nums[i] = nums[temp - 1];
             nums[temp - 1] = temp;
         }
     }
     int *ans = (int *)malloc(sizeof(int) * numsSize);
     int pos = 0;
     for (int i = 0; i < numsSize; ++i) {
         if (nums[i] - 1 != i) {
             ans[pos++] = nums[i];
         }
     }
     *returnSize = pos;
     return ans;
 }
 ​

四、总结:

题目链接:442. 数组中重复的数据

题目很好,体验很好~希望下次不要再出了。。。。