【刷题之路】重复值判断

来源:互联网 发布:caxa自动编程与训练 编辑:程序博客网 时间:2024/06/11 18:58

请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为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;
        }
    }

0 0
原创粉丝点击