[蓝蓝计算机考研]-day17

63 阅读1分钟

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

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

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

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

前奏

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

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

为了加深大家的印象,画了下面这个图,即将上面两段数据和下方的数据进行了交换。

  • 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;
}