对于n个元素,每一个数据的范围[0,n-1],找到一个重复元素,空间O(1),时间O(n)
解法一:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int radix_sort (int *arr, int num) {
int temp;
for (int i = 0;i < num;i++) {
while (i != arr[i]) {
if (arr[i] == arr[arr[i]]) {
return arr[i];
}
temp = arr[arr[i]];
arr[arr[i]] = arr[i];
arr[i] = temp;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = radix_sort (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int RepeatNum (int *arr, int num) {
for (int i = 0;i < num;i++) {
int index = arr[i] >= num ? arr[i]-num : arr[i];
if (arr[index] >= num) {
return index;
}
else {
arr[index] += num;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = RepeatNum (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}