美文网首页
重复值判断

重复值判断

作者: IT_Matters | 来源:发表于2016-06-27 17:09 被阅读144次

    题目

    请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。
    给定一个int数组A及它的大小n,请返回它是否有重复值。

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

    思路

    如果没有空间复杂度的限制,我们应该用哈希的思想去做。但是本题要求空间复杂度必须为O(1)。所以我们先进行排序,再比较相邻的元素是否重复即可。所以我们需要一种空间复杂度为O(1)的排序算法,非递归的快速排序和堆排序都是时间复杂度O(n*lgn),空间复杂度O(1)的。这里我们选用堆排序,代码如下。

    import java.util.*;
    
    public class Checker {
        public boolean checkDuplicate(int[] a, int n) {
            heapSort(a);
            for(int i=0;i<n-1;i++){
                if(a[i]==a[i+1]){
                    return true;
                }
            }
            return false;
        }
        
        private void heapSort(int []a){
            int hi=a.length-1;
           //建堆
            for(int i=(hi-1)/2;i>=0;i--){
                sink(a,i,hi);
            }
           //下沉排序
            for(int i=hi;i>=0;i--){
                swap(a,0,i);
                sink(a,0,i-1);
            }
        }
        
        private void sink(int[]a,int lo,int hi){
            int child;
            while((child=lo*2+1)<=hi){
                if(child<hi&&a[child]<a[child+1])child++;
                if(a[lo]>=a[child]) break;
                swap(a,lo,child);
                lo=child;
            }
        }
    
        private void swap(int[] A, int i, int j) {
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
            
    }
    

    相关文章

      网友评论

          本文标题:重复值判断

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