1. 程式人生 > >LeetCode 442. 陣列中重複的資料(C、C++、python)

LeetCode 442. 陣列中重複的資料(C、C++、python)

給定一個整數陣列 a,其中1 ≤ a[i] ≤ n (n為陣列長度), 其中有些元素出現兩次而其他元素出現一次

找到所有出現兩次的元素。

你可以不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?

示例:

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[2,3]

C

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDuplicates(int* nums, int numsSize, int* returnSize) 
{
    int n=numsSize;
    int* res=(int*)malloc(sizeof(int)*n);
    int k=0;
    for(int i=0;i<n;i++)
    {
        int index=abs(nums[i])-1;
        if(nums[index]>0)
        {
            nums[index]=-nums[index];
        }
        else
        {
            res[k++]=abs(nums[i]);
        }
    }
    *returnSize=k;
    return res;
}

C++

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

python

class Solution:
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        res=[]
        n=len(nums)
        for i in range(n):
            index=abs(nums[i])-1
            if nums[index]>0:
                nums[index]=-nums[index]
            else:
                res.append(abs(nums[i]))
        return res