Blog A Paranoid Guy

重复值判断

2017-01-31

题目如下:

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

[1,2,3,4,5,5,6],7 返回:true

思路是先排成有序序列,然后再比较。根据空间复杂度为1,所以选择堆排序:

    /* 重复值判断  */
    public class Checker {
        public void heapAdjust(int[] A, int parent, int n) {
            int temp = A[parent]; //保存父结点
            int child = 2 * parent + 1; //保存左孩子结点
            
            while (child < n) {
                //判断左孩子是否小于右孩子
                if (child + 1 < n && A[child] < A[child + 1]) {
                    child++;
                }
                //判断父结点是否大于孩子结点
                if (temp >= A[child]) {
                    break;
                }
                A[parent] = A[child];
                parent = child;
                child = 2 * parent + 1;
            }
            
            A[parent] = temp;
        }
        
        public int[] heapSort(int[] A, int n) {
            //建立初始堆
            for (int i = n / 2; i >= 0; i--) {
                heapAdjust(A, i, n - 1);
            }
            
            //排序
            for (int i = n - 1; i > 0; i--) {
                int temp = A[0];    
                A[0] = A[i];
                A[i] = temp;
                
                heapAdjust(A, 0, i);
            }
            
            return A;
        }
        
        public boolean checkDuplicate(int[] A, int n) {
            A = heapSort(A, n);
            
            for (int i = 1; i < n; i++) {
                if (A[i] == A[i - 1]) {
                    return true;
                }
            }
            
            return false;
        }
    }

Similar Posts

Comments