一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
#include<iostream>
#include<ctime>
#include<iterator>
using namespace std;
pair<bool,int> find_dup(int a[],int n)
{
for(int i=0;i<n;i++){
while(a[i]!=i){
int k = a[i];
if( a[k] == k ) return pair<bool,int>(true,k);
swap(a[i],a[k]);
}
}
return pair<bool,int>(false,0);
}
int main()
{
int n; cin>>n;
srand(time(NULL));
int a[n];
for(int i=0;i<n;i++){ a[i] = rand()%n; }
pair<bool,int> ans = find_dup(a,n);
if( ans.first ) cout<<ans.second<<endl;
else cout<<"all single"<<endl;
}