23、给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4。要求:
-
给出算法的基本设计思想。
-
根据设计思想,采用C或C++语言描述算法,关键之 处给出注释。
-
说明你所设计算法的时间复杂度和空间复杂度。
前奏
读完题目先找关键词,这里可以直接提取这样几个关键词
- 使用数组,求未出现的最小正整数
- 看到数组,是不是想到是否有序
- 时间+空间尽可能高效
为了加深大家的印象,画了下面这个图,即将上面两段数据和下方的数据进行了交换。
-
1、思路 建立map记录每个数出现的次数,从1开始遍历,遇到次数为0输出
-
2、具体实现
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int FindMinPI(vector<int> arr)
{
unordered_map<int, int> record;
int res = 1;
for (int val : arr) record[val]++;
while (record[res]) res++;
return res;
}
int main()
{
vector<int> arr ;
int a;
while (cin >> a)
{
arr.push_back(a);
if (cin.get() == '\n')break;
}
int res = FindMinPI(arr);
cout << "该数组中未出现的最小正整数为:" << res;
return 0;
}