2_14重复值判断

请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139
  • 该文章总结自牛课网的在线算法课程(https://www.nowcoder.com/) 经典排序算法就是前面讲那几...
    锅与盆阅读 7,740评论 6 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,764评论 18 399
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 很多朋友把高尿酸、痛风称作「富贵病」。而事实也是这样,「出门有车,吃饭有肉」的生活习惯,造就了痛风、高血脂、糖尿病...
    博慧bohui阅读 307评论 0 0