題目描述
在一個長度為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;
}
};