(笔试题)如何判断数组中是否存在重复元素

题目:

假设数组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;
}
posted @ 2015-08-09 20:11  AndyJee  阅读(2269)  评论(0编辑  收藏  举报