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

题目:
给定一个长度为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]<=μ-σ(或更小)的数据就几乎可以获得答案了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值