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

113 阅读1分钟

23、给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。要求:

  1. 给出算法的基本设计思想。

  2. 根据设计思想,采用C或C++语言描述算法,关键之 处给出注释。

  3. 说明你所设计算法的时间复杂度和空间复杂度。

前奏

读完题目先找关键词,这里可以直接提取这样几个关键词

  • 使用数组,求未出现的最小正整数
  • 看到数组,是不是想到是否有序
  • 时间+空间尽可能高效

思路

先预定一个最小正整数1,然后依次遍历数组中的数据,如果有等于目前定义的最小正整数则“最小正整数”+1,依次遍历至数组末尾即可得到真正的最小正整数。

具体实现

static int search_Min(int[] num){
    int temp[] = new int[num.length+1];
    for (int i = 0;i < num.length;i++){
        if (num[i] > 0 && num[i] <= num.length){
            temp[num[i] - 1] = 1;
        }
    }
    for (int i = 0;i < temp.length;i++){
        if (temp[i] == 0)return i + 1;
    }
   return temp.length;
}