[蓝蓝计算机考研算法训练二期]-day17

78 阅读1分钟

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)