【LeetCode】442. Find All Duplicates in an Array(C++)

本文介绍了一种解决LeetCode中寻找数组中所有重复数字问题的方法,利用原地算法在O(n)时间复杂度内完成,避免了额外的空间消耗。通过对数组元素的交换和检查,有效地找出并返回所有重复的元素。

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

地址:https://leetcode.com/problems/find-all-duplicates-in-an-array/

题目:

Given an array of integers, 1 ≤ a[i] ≤ n n n ( n 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 ) O(n) O(n) runtime?
Example:

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

理解:

数组本来是从1-n,现在某些元素重复了两侧,要找出重复的元素。

实现:

对于正常的数组,应该满足nums[i] == i + 1,即1在0的位置。。。
对于某个元素,我们判断nums[i] != nums[nums[i] - 1]是否成立。对于不存在重复的元素,要通过交换使得其在合适的位置上;对于重复的元素,只要其重复元素在本身的位置上就可以了。(也就是这步是把每个出现的元素的对应位置添上对应的元素),对于多余的,就随便放到当前的位置就可以了。

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(i = 0;i<nums.size(); ++i){
            if(nums[i]-1!=i)
                res.push_back(nums[i]);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值