求数组里不存在的最小正整数
来源:互联网 发布:淘宝图片申请实拍保护 编辑:程序博客网 时间:2024/06/14 08:30
题目:
给定一个长度为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]<=μ-σ(或更小)的数据就几乎可以获得答案了。
0 0
- 求数组里不存在的最小正整数
- 求数组中未出现的最小正整数
- 求数组中未出现的最小正整数
- 求正整数数组构成的最小数(某公司2013年校园招聘笔试试题)
- 数组中未出现的最小正整数
- 数组中未出现的最小正整数
- 数组中未出现的最小正整数
- 数组中缺失的最小正整数
- 数组中为出现的最小正整数
- 数组中未出现的最小正整数
- 数组中未出现的最小正整数
- 正整数数组的最小不可组成和
- 数组中未出现的最小正整数
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 返回数组最小正整数
- Java给定一个数组,数组元素是一些正整数,求这些正整数收尾详解得出的最大数或最小数
- 给定一个数组,找出数组缺少的最小的正整数
- 数组与矩阵---数组中未出现的最小正整数
- 读书笔记-程序是如何跑起来的(第二章)
- Delphi COM编程技术五(ActiveX技术)
- 黑科技兼容H5高宽不固定水平垂直居中
- 不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息
- unity3D使用NGUI创建gameobject时game窗口不显示问题
- 求数组里不存在的最小正整数
- webservice客户端引用服务端程序详解
- 在STS中部署tomcat
- Delphi COM编程技术六(DCOM技术)
- 如何有效汇报项目
- Dijkstra和Floyd算法
- 委托类 单例
- IDEA的快捷键设置以及常用设置
- 14-每天一个Linux命令 head