请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)
通常来说判断重复值,比较有效的方法是先排序。保证额外空间复杂度为1,则选择堆排序较为合适。堆排序出现过多次,不再详述
class Checker {
public:
bool checkDuplicate(vector<int> a, int n) {
// write code here
int i;
maxheap(a,n);
for(i=n-1;i>=0;i--){
swap(a[0],a[i]);
fixdown(a,0,i);
}
for(i=0;i<n-1;i++){
if(a[i]==a[i+1]) return true;
}
return false;
}
void maxheap(vector<int> &a,int n){
int i;
for(i=n/2-1;i>=0;i--){
fixdown(a,i,n-1);
}
}
void fixdown(vector<int> &a,int i,int n){
int j;
while(2*i+1<n){
if(2*i+2>n-1) j=2*i+1;
else if(a[2*i+1]<a[2*i+2] && i*2+2< n) j=2*i+2;
else j=2*i+1;
if(a[i]<a[j]){
swap(a[i],a[j]);
i=j;
}
else break;
}
}