美文网首页
2_14重复值判断

2_14重复值判断

作者: X_Y | 来源:发表于2017-09-06 17:01 被阅读8次

    请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。

    给定一个int数组A及它的大小n,请返回它是否有重复值。

    测试样例:
    输入:[1,2,3,4,5,5,6],7
    返回:true

    class Checker {
    public:
        void swap(vector<int> &A,int i,int j)
        {
            int temp;
            temp=A[i];
            A[i]=A[j];
            A[j]=temp;
        }
        // 调整堆, adjusting_node是当前待调整的节点,last_node是最后一个节点
        void adjust_haep(vector<int> &A, int adjusting_node, int last_node)
        {
           int parent =  adjusting_node, child = 2 * adjusting_node + 1;
           int curr_value = A[adjusting_node];
           while(child <= last_node){
               if(child < last_node && A[child] < A[child+1]){
                   ++child;
               }
               if(curr_value < A[child]){
                   A[parent] = A[child];
                   parent = child;
                   child = 2*parent + 1;
               }
               else{
                   break;
               }
           }
           A[parent] = curr_value;
        }
    
        bool checkDuplicate(vector<int> a, int n) {
            // write code here
            // 生成堆,从最后节点的parent开始
            for(int i=n/2-1; i>=0; --i){
                adjust_haep(a, i, n-1);
            }
            // 每次A[0]和最后的节点交换,然后调整堆 
            for(int i=n-1; i>0; --i){
                swap(a, i, 0);
                adjust_haep(a, 0, i-1);
                if(i<n-1 && a[i] == a[i+1]){
                    return true;
                }
            }
            return false;
        }
    };
    

    相关文章

      网友评论

          本文标题:2_14重复值判断

          本文链接:https://www.haomeiwen.com/subject/dbjvjxtx.html