面試題03:數組中重復的數字(C++)


題目地址:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

題目描述

找出數組中重復的數字。在一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。

題目示例

輸入:[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3

解題思路

遍歷數組並通過交換操作使索引與值一一對應,(即 nums[i] = i ),這樣就能通過索引找到對應值。在遍歷數組時,每次遇到索引為 i 的新數字 nums[i] 時,將其交換至索引為 nums[i] 的 nums[nums[i]] 處。而當遍歷遇到一個重復數字 i時,一定有 nums[i] == i (因為第一次遇到 i 時已經將其交換至 nums[i] 處了),如此即可得到一組重復數字。

程序源碼

方法1

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        if(nums.empty()) return -1;
        sort(nums.begin(), nums.end());
        int res;
        for(int i = 0; i < nums.size() - 1; i++)
        {
            if(nums[i] == nums[i + 1])
            {
                res = nums[i];
                break;
            }
        }
        return res;
    }
};
/*
class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        if(nums.empty()) return -1;
        sort(nums.begin(), nums.end());
        int res;
        unordered_map<int, int> mp;
        for(int i = 0; i < nums.size(); i++)
        {
            mp[nums[i]]++;
        }
        for(int i = 0; i < mp.size(); i++)
        {
            if(mp[nums[i]] > 1) 
            {
                res = nums[i];
                break;
            }
        }
        return res;
    }
};
*/

方法2

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        if(nums.empty()) return 0;
        unordered_set<int> s;
        for(int i = 0; i < nums.size(); i++)
        {
            if(s.count(nums[i]) > 0) return nums[i];
            s.insert(nums[i]);
        }
        return 0;
    }
};
View Code

方法3

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM