求数组里不存在的最小正整数

题目:
给定一个长度为N整形数组a[],所有数据为正整数,且允许重复。要求寻找数组中不存在的最小正整数。

最初的思路是对数组进行排序,然后再从1开始比对,那个数没出现,它就是答案。这样做效率太低,然后想了另一种办法。
利用哈希表,定义一种关系:定义一个大小为(N/32+1)的整形数组b,因为一个整形数据有32位,假设b[0]的第一位是1,第二位是2,·····,所以b[0],就可以存储1-32。此时,如果我从数组a中读取的第一个数a[0]=20,那么用位运算b[0] |= (1<<20-1),也可以表示为b[a[0]/32] |= (1<

public class ArrayMin {

    public static void main(String[] args){
        int[] a={4 ,7,58,6,5,3,74,32,68,41,85,2,34,7,79512,3,4,57,2,1,6,5,46813,62145};
        System.out.println(arrayMin(d));
    }

    private static int arrayMin(int [] arr){

        int N=arr.length;
        int [] arr_temp=new int[N/32+1];

        for(int i=0;i<N;i++){//遍历数组a的数据,并映射到数组b
            if(arr[i]<=N)
                arr_temp[arr[i]/32]|=(1<<(arr[i]%32-1));        
        }


        for(int i=0;i<arr_temp.length;i++){//寻找第一个是0的位
            for(int j=0;j<32;j++){
                if((arr_temp[i]>>j&1)==0)
                    return (i+j+1);
            }
        }
        return 0;
    }

}

再细细想想:假设数组中每个数据是任何整数的概率是相同的,也就是a[i]=n(0< n <=Integer.MAX_VALUE)的概率是(1/Integer.MAX_VALUE)。那么答案是1的概率是不是很大?只要数组中不存在1,答案就是1;答案是2的条件是:存在1并且不存在2,后面的数字要求越来越高,所以,我认为,前20个数字中某一个数为答案的概率几乎接近1了,所以进一步提高效率就可以只把a[i]<=20的数映射到数组b里,这样时间复杂度和空间复杂度都可以进一步优化,当然,这样也是存在风险的,所以可以根据实际情况去分析。
另一种情况:假如数据符合正态分布(现实中很多数据符合),那么根据正太分布的那个概率公式,只映射a[i]<=μ-σ(或更小)的数据就几乎可以获得答案了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章