數組中重復的數字


數組中重復的數字

題目描述

在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那么對應的輸出是第一個重復的數字2。

來回利用交換, 首先比較位置i上的數字和i是否相等, 若相等把i移動到當前位置的下一位, 若不相等, 把位置i上的數字記為temp比較位置temp上的數字和i上的數字是否相等, 若相等, 則找到重復數字

class Solution {
public:
    // Parameters:
    //        numbers:     an array of integers
    //        length:      the length of array numbers
    //        duplication: (Output) the duplicated number in the array number
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    bool duplicate(int numbers[], int length, int* duplication) {
        int i = 0;
        while (i < length) {
            while (i != numbers[i]) {
                int temp = numbers[i];
                if (numbers[i] == numbers[temp]) {
                    *duplication = numbers[i];
                    return true;
                }
                swap(numbers[i], numbers[temp]);
            }
            i++;
        }
        return false;
    }
};

利用哈希表, 和之前第一個只出現一次的字符位置相同

class Solution {
public:
    // Parameters:
    //        numbers:     an array of integers
    //        length:      the length of array numbers
    //        duplication: (Output) the duplicated number in the array number
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    bool duplicate(int numbers[], int length, int* duplication) {
        vector<int> vt;
        vt.resize(length);
        for (int i = 0; i < length; i++) {
            vt[numbers[i]]++;
        }
        for (int i = 0; i < length; i++) {
            if (1 != vt[numbers[i]]) {
                *duplication = numbers[i];
                return true;
            }
        }
        return false;
    }
};


免責聲明!

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



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