📅  最后修改于: 2023-12-03 15:26:09.486000             🧑  作者: Mango
本文将介绍一个常见的问题:有一个长度为n的数组,其中的元素是从1到n的整数,但其中有一个数出现了两次。如何找出这个重复数?
首先,可以对数组进行排序,然后遍历一次数组即可找到重复数。排序算法的时间复杂度为O(nlogn),其中n为数组的长度。
void findDuplicate(int arr[], int n) {
sort(arr, arr + n);
for(int i = 1; i < n; i++) {
if(arr[i] == arr[i-1]) {
cout << "Duplicate number is: " << arr[i] << endl;
break;
}
}
}
第二种解法是利用哈希表来记录每个元素的出现次数。遍历一次数组,如果一个元素出现的次数已经为1,那么这个元素就是重复元素。哈希表的时间复杂度为O(n),其中n为数组的长度。
void findDuplicate(int arr[], int n) {
unordered_map<int, int> map;
for(int i = 0; i < n; i++) {
if(map[arr[i]] == 1) {
cout << "Duplicate number is: " << arr[i] << endl;
break;
}
map[arr[i]]++;
}
}
第三种解法是利用位运算。由于数组中的元素是从1到n的整数,所以可以把这些数的二进制表示的每一位看作一个状态,每个状态只能是0或1。用一个二进制数来表示这个状态,并将所有元素的状态进行异或操作,得到的结果就是重复元素的状态。位运算的时间复杂度为O(nlogm),其中m为最大的元素值(在本题中为n)。
void findDuplicate(int arr[], int n) {
int xor_result = 0;
for(int i = 1; i <= n; i++) {
xor_result ^= i;
}
for(int i = 0; i < n; i++) {
xor_result ^= arr[i];
}
cout << "Duplicate number is: " << xor_result << endl;
}
以上三种解法都可以找到重复数,但时间复杂度和空间复杂度有所不同。程序员可以根据实际情况选择最适合自己的解法。