1. 程式人生 > 其它 >LeetCode-442 陣列中重複的資料

LeetCode-442 陣列中重複的資料

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array

題目描述

給你一個長度為 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 <= 105
1 <= nums[i] <= n
nums 中的每個元素出現 一次 或 兩次

解題思路

如果沒有空間複雜度的需求,那麼計數統計是很好的辦法,但是題目要求空間複雜度為O(1),那麼不使用額外的空間去完成這道題,就需要在原陣列中做文章了。由於陣列的資料範圍是1-n,如果不重複的話,那麼每一個數字k將可以放入對應的k-1的位置,如果k-1位置上的不是k,那麼可以判斷這個數字重複。所以第一步,將數字k儘可能的放入對應的k-1位置上,第二步遍歷陣列尋找k-1位置上不是k的數字,加入結果。

程式碼展示

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

執行結果