首页 > 编程知识 正文

没有最小的正数,但有最小的正整数,数组未出现的最小正整数

时间:2023-05-05 10:25:52 阅读:184553 作者:4433

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。