1、暴力法
最简单的方法,使用两层嵌套循环来检查每对元素是否相同。时间复杂度为O(n^2)
,不推荐在大型数组上使用,因为效率较低。
#include <stdio.h>
void findDuplicatesBruteForce(int arr[], int size) {
for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
if (arr[i] == arr[j]) {
printf("Duplicate found: %d\n", arr[i]);
}
}
}
}
int main() {
int arr[] = {4, 3, 2, 7, 8, 2, 3, 1}; // 示例数组
int size = sizeof(arr) / sizeof(arr[0]);
printf("Using Brute Force:\n");
findDuplicatesBruteForce(arr, size);
return 0;
}
2、使用哈希表
利用哈希表(散列表)来存储每个元素及其出现次数,时间复杂度为O(n)
,但需要额外的空间来存储哈希表。
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 假设数组的最大大小为100
void findDuplicatesUsingHash(int arr[], int size) {
int hash[MAX_SIZE] = {0}; // MAX_SIZE 应足够大
for (int i = 0; i < size; i++) {
hash[arr[i]]++;
}
for (int i = 0; i < MAX_SIZE; i++) {
if (hash[i] > 1) {
printf("Duplicate found: %d\n", i);
}
}
}
int main() {
int arr[] = {4, 3, 2, 7, 8, 2, 3, 1}; // 示例数组
int size = sizeof(arr) / sizeof(arr[0]);
printf("Using Hash Table:\n");
findDuplicatesUsingHash(arr, size);
return 0;
}
3、排序后查找
先对数组进行排序,然后检查相邻的元素是否相同。时间复杂度为O(n log n)
,空间复杂度取决于排序算法的实现。
#include <stdio.h>
#include <stdlib.h>
// Helper comparison function for sorting
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
// Function to find duplicates in an array using sorting
void findDuplicatesSorting(int arr[], int size) {
qsort(arr, size, sizeof(int), compare);
for (int i = 1; i < size; i++) {
if (arr[i] == arr[i - 1]) {
printf("Duplicate found: %d\n", arr[i]);
}
}
}
int main() {
int arr[] = {4, 3, 2, 7, 8, 2, 3, 1}; // Example array
int size = sizeof(arr) / sizeof(arr[0]);
printf("Using Sorting:\n");
findDuplicatesSorting(arr, size);
return 0;
}
4、使用标记数组
如果数组中的元素在一定范围内(例如0到n-1),可以使用一个额外的标记数组来标记每个元素是否已经访问过。时间复杂度为O(n),空间复杂度为O(n)。
#include <stdio.h>
#include <string.h>
void findDuplicatesUsingMarker(int arr[], int size) {
int visited[size];
memset(visited, 0, sizeof(visited));
for (int i = 0; i < size; i++) {
if (visited[arr[i]]) {
printf("Duplicate found: %d\n", arr[i]);
} else {
visited[arr[i]] = 1;
}
}
}
int main() {
int arr[] = {4, 3, 2, 7, 8, 2, 3, 1}; // 示例数组
int size = sizeof(arr) / sizeof(arr[0]);
printf("Using Marker Array:\n");
findDuplicatesUsingMarker(arr, size);
return 0;
}
5、使用异或操作
如果数组中的元素有特定的范围和性质,可以利用异或操作来找出重复的元素。这种方法具有较高的空间效率,但需要数组元素有一定的限制条件。
#include <stdio.h>
void findDuplicatesUsingXOR(int arr[], int size) {
int xor = 0;
for (int i = 0; i < size; i++) {
xor ^= arr[i];
}
for (int i = 1; i < size; i++) {
xor ^= i;
}
printf("Duplicate found: %d\n", xor);
}
int main() {
int arr[] = {4, 3, 2, 7, 8, 2, 3, 1}; // 示例数组
int size = sizeof(arr) / sizeof(arr[0]);
printf("Using XOR Method:\n");
findDuplicatesUsingXOR(arr, size);
return 0;
}