今天去乐视笔试的一个题目。题目大意如下,给一个整数序列,找出其中没出现过的最小的正整数。
如输入:1,2,0。则未出现的最小正整数是3。
如输入:3,3,2,-1。则未出现的最小正整数是2。
要求时间复杂度O(N),空间复杂度是N(1)。
这个一开始确实是不知道怎么做,主要是这个复杂度限制。后来经过讨论,终于想到了一个办法。即采用本地数组的空间,将正整数k放在第k-1位。再重头过一遍,即可知道哪个数没出现过了。
具体代码如下。
//最小的不存在的正整数
int minNonExist(int[]arr){
int next=-1;
while(++next<arr.length){
int tmp=arr[next];
while(tmp>=1&&tmp<=arr.length&&arr[tmp-1]!=tmp){
int t2=arr[tmp-1];
arr[tmp-1]=tmp;
tmp=t2;
}
}
for(int k=0;k<arr.length;++k)
if(arr[k]!=k+1)
return k+1;
return arr.length+1;
}