题目:
假设数组a有n个元素,元素的取值范围为1~n,如何判定数组是否存在重复元素?
思路:
方法1:
数组排序,比较相邻元素是否相等;
时间复杂度:O(nlogn),空间复杂度:O(1)
方法2:
使用bitmap(位图),定义长度为N/8的char数组,每个bit表示对应数字是否出现过。遍历数组,使用bitmap对数字是否出现过进行统计。
时间复杂度:O(n),空间复杂度:O(n)
方法3:
遍历数组,假设第i个位置的数字为j,则通过交换将j换到下标为j的位置上,直到所有数字都出现在自己对应的下表处,或发生了冲突。
时间复杂度:O(n),空间复杂度:O(1)
代码:
方法1:
int cmp(const void* a,const void* b){ return (*(int*)a-*(int*)b); } // sort and compare bool findDuplicate(int* a,int n){ if(a==NULL || n<=1) return false; qsort(a,n,sizeof(int),cmp); for(int i=0;i<n;i++){ if(a[i+1]>a[i]) return true; } return false; }
方法2:
// changed to the right position bool findDuplicate_1(int* a,int n){ if(a==NULL || n<=1) return false; for(int i=0;i<n;i++){ int tmp=a[i]; if(tmp-1==i) continue; if(tmp==a[tmp-1]) return true; a[i]=a[tmp-1]; a[tmp-1]=tmp; i--; } return false; }