23、给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。要求:
-
给出算法的基本设计思想。
-
根据设计思想,采用C或C++语言描述算法,关键之 处给出注释。
-
说明你所设计算法的时间复杂度和空间复杂度。
前奏
读完题目先找关键词,这里可以直接提取这样几个关键词
- 使用数组,求未出现的最小正整数
- 看到数组,是不是想到是否有序
- 时间+空间尽可能高效
思路
先预定一个最小正整数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;
}