1. 程式人生 > >劍指offer 1. 找出陣列中重複的數字

劍指offer 1. 找出陣列中重複的數字

給定一個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0∼n−1 的範圍內。
陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。
請找出陣列中任意一個重複的數字。
注意:如果某些數字不在 0∼n−1 的範圍內,或陣列中不包含重複數字,則返回 -1;
樣例

給定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。

常規做法

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        unordered_set<
int>s; int flag = 0; for(auto &x : nums){ if(x > nums.size() - 1 || x < 0) return -1; if(s.count(x)) flag = x; s.insert(x); } if(flag) return flag; return -1; } };

這個題最好的時間複雜度是 O

( n ) O(n)
空間複雜度是可以降到 O ( 1 )
O(1)

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