重复值判断

题目

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

你可能感兴趣的:(重复值判断)