从一个1到n的数组中找出重复的元素 空间复杂度为O(1), 时间复杂度O(n)
第一种是将每个数组中的元素放到它对应的位置中去 比如 a[1] = 6, a[6] 如果不是6 则 继续取出a[6] 中的值 继续比较. 如果a[6] 等于6 则说明值重复了 打印该值 并将 该值+n. 扫描一遍数组即可 第二种 将扫描到的数 变为负数 如果下一次在扫描到 说明重复了
void dup1(int arr[], int n){
int tmp;
for(int i = 1; i <= n; ++i){
if(arr[i] == i || arr[i] > n)
continue;
tmp = arr[i];
while(1){
if(arr[tmp] > n)
break;
if(arr[tmp] == tmp){
cout << arr[tmp] << " ";
arr[tmp] += n;
break;
} else if(arr[tmp] == i){
arr[i] = i;
arr[tmp] = tmp;
break;
}
int k = arr[tmp];
arr[tmp] = tmp;
tmp = k;
}
}
}
第二种 将扫描到的数 变为负数 如果下一次在扫描到 说明重复了
void dup(int arr[], int n)
{
for(int i =0; i < n; ++i){
if(arr[i] > 0){
if(arr[arr[i]] < 0){
cout << arr[i] << " ";
}
else{
arr[arr[i]] = -arr[arr[i]];
}
}
else{
if(arr[-arr[i]] < 0){
cout << -arr[i] << " ";
}
else{
arr[-arr[i]] = -arr[-arr[i]];
}
}
}
}