问题描述:
一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
如果没有时间,空间的要求,那解法会相当的多,hash table,STL当中的set等都可以很方便的解决。网上大多的解法是基于基数排序,还有标记法。本人由于兴趣,采用交换标记法,代码如下:
#include<iostream>
#include<math.h>
bool Repeat(int array[], int n) {
for (int i = 0; i < n; i++) {
int currentNumber = array[i];
if (fabs(currentNumber)
== (-array[currentNumber > 0 ? currentNumber : -currentNumber])) {
if (currentNumber == 0 && i == 0)
continue;
return true;
} else if (currentNumber == array[currentNumber]) {
array[currentNumber] = -currentNumber;
} else {
array[i] = array[currentNumber];
array[currentNumber] = currentNumber;
}
}
return false;
}
void print(bool repeat, int caseNumber) {
if (repeat)
std::cout << "case :" << caseNumber << " repeat" << std::endl;
else
std::cout << "case :" << caseNumber << " non repeat" << std::endl;
}
int main() {
bool isReapt = false;
//test case 1
int array1[] = { 1, 4, 2, 3, 1 };
isReapt = Repeat(array1, 5);
print(isReapt, 1);
//test case 2
int array2[] = { 0, 4, 2, 3, 1 };
isReapt = Repeat(array2, 5);
print(isReapt, 2);
//test case 3
int array3[] = { 0, 0, 0, 0, 0 };
isReapt = Repeat(array3, 5);
print(isReapt, 3);
return 0;
}
实现方式2: 只用一个中间变量,原地检测
public static boolean duplicateElements(int array[], int n) {
int temp = 0;
for (int i = 0; i < n; i++) {
if (array[i] != array[array[i]]) {
temp = array[array[i]];
array[array[i]] = array[i];
array[i] = temp;
} else if(array[i] != i)
return true;
}
return false;
}
转载请注明出处 http://blog.csdn.net/typename/article/details/8247570
仅供交流.