题解——Leetcode 442. Find All Duplicates in an Array 难度:Medium

这道中等难度的LeetCode题目要求在O(n)时间复杂度和不使用额外空间的情况下,找出数组中所有重复的元素。通过遍历数组并交换不符合条件的元素,使得只出现一次的元素满足nums[i]=i+1,而未满足此条件的元素即为重复项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]


题目如上,简化后的题意如下:

给你一个整数数组,元素大小介于1和数组大小n之间,有些元素会出现两次而其他元素只出现一次。如何在O(n)的时间复杂度以及不占用额外内存的条件下找出所有出现两次的元素。

C++程序如下:

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        vector<int> res;
        int i = 0;
        while(i < nums.size()){
            if(nums[i] != nums[nums[i] - 1])
                swap(nums[i], nums[nums[i] - 1]);
            else
                i++;
        }
        for(int i = 0; i < nums.size(); i++)
            if(i != nums[i]-1)
                res.push_back(nums[i]);
                
        return res;
    }
};

解题的关键在于元素大小介于1和n之间,如果我们将所有元素从小到大排列,假设所有元素都只出现一次,那么nums[i]=i+1,但由于有重复出现的元素,所以那些nums[i]-1!=i的元素即为重复元素。

但题目还有另一个要求,时间复杂度为O(n),常规排序是达不到的。本题对数组元素挨个判断是否满足nums[i]=i+1,如果不满足,将nums[i]置换到对应位置上即nums[nums[i]-1],这样的话下标为nums[i]-1的元素就满足了条件,但交换后下标为i的元素不一定满足,但只要重复交换一定的次数,总会满足条件。所以经过对每个元素的交换操作,只出现一次的元素都满足了nums[i]=i+1,而那些不满足的元素即为出现两次的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值