23、【2018统考真题】给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。
要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++语言描述算法,关键之 处给出注释。
3)说明你所设计算法的时间复杂度和空间复杂度。
1)
设置一个辅助数组,来记录出现的正整数的次数。遍历原数组,当当前元素大于数组长度时该元素肯定不是未出现的最小正整数,所以当当前元素为正整数,且小于等于原数组长度时,辅助数组下标为该数的位置设为1,表示该正整数出现过。然后从下标为1处开始遍历辅助数组,第一个为0的位置的下标即为原数组中未出现的最小正整数,否则未出现的最小正整数原数组长度加1。
2)
int SearchMin(int num[],int length){
int temp[length+1];//辅助数组
//遍历原数组,符合条件的数记录到辅助数组中
for(int i=0;i<length;i++){
if(num[i]>0&&num[i]<=length)
temp[num[1]]=1;
}
//遍历辅助数组,为0的下标即为未出现的最小正整数
for(int i=1;i<length+1;i++){
if(temp[i]==0)
return i;
}
//否则未出现的最小正整数原数组长度加1
return length+1;
}
3)
时间复杂度:O(n)
空间复杂度:O(n)