给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。
算法:用一个辅助数组b[n+1]记录a[n]中元素的是否出现,初始全部为0。例如如果a[0]=1,则b[1]=1,a[3]=2,则b[2]=1;
如果a[i]>n则不记录,因为如果1-n中元素没有全部出现则缺少的元素一定在1-n中无需记录大于n的数是否出现。
遍历一次a数组记录是否出现,再遍历一次b数组看是否存在为0的元素(从下标为1开始循环到n),找到第一个退出循环。
如果没有中途退出而是正常结束循环,说明答案为n+1.
算法时间复杂度为O(n),因为使用了辅助数组,所以空间复杂度为O(n+1)。
void find_min_miss(int a[],int n){
int b[n+1];
for(int i=0;i<n;i++){
if(a[i]>0&&a[i]<=n) b[a[i]]=1;
}
int i;
for(i=1;i<=n;i++){
if(b[i]==0) break;
}
if(i==n+1) return n+1;
else return i;
}