【每日一题】2018考研数据结构真题 - 求未出现的最小正整数

题目描述

给定一个含有 n 个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如:

  • 输入: {-5, 3, 2, 3}
  • 输出: 1
  • 输入: {1, 2, 3}
  • 输出: 4

思路分析

我们需要找到数组中未出现的最小正整数。根据题目的要求,可以采取以下步骤:

  1. 过滤无效数据:只考虑正整数,负数和零不影响我们寻找最小正整数的结果。
  2. 使用哈希集合:我们可以用哈希表(unordered_set)来存储数组中的正整数,方便快速查找。
  3. 从1开始查找:从1开始逐个检查,直到找到第一个不在集合中的正整数。

这种方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度也为 O ( n ) O(n) O(n),在实际应用中表现良好。

C++ 代码实现

以下是实现该算法的 C++ 代码:

#include "bits/stdc++.h"

using namespace std;

int min(vector<int> value) {
    
    
    unordered_set<int> sets;
    
    // 将数组中的所有元素插入集合
    for(int v : value) {
    
    
        sets.insert(v);
    }
    
    int minValue = 1;
    
    // 查找未出现的最小正整数
    while(sets.count(minValue)) {
    
    
        minValue++;
    }
    return minValue;
}

int main() {
    
    
    vector<int> a = {
    
    -5, 3, 2, 3}; // 示例数组
    cout << min(a) << endl; // 输出结果
    
    return 0;
}

代码讲解

  1. 导入库:我们使用 #include "bits/stdc++.h",这是一个常用的头文件,包含了大多数标准库。

  2. min 函数

    :接收一个整数向量

    value
    

    ,返回未出现的最小正整数。

    • 创建一个 unordered_set<int> sets 用于存储正整数。
    • 遍历 value 中的每一个元素,插入到集合中。
  3. 查找最小正整数

    • 初始化 minValue 为1,从1开始查找。
    • 使用 sets.count(minValue) 来检查当前的 minValue 是否存在于集合中。如果存在,说明当前数字已经出现,继续加1,直到找到未出现的数字。
  4. 主函数:测试 min 函数的实现,输出结果。

    扫描二维码关注公众号,回复: 17425376 查看本文章

unordered_set 使用介绍

unordered_set 是 C++ STL 中的一个容器,基于哈希表实现。与其他集合容器相比,它具有以下优点:

  • 平均时间复杂度为 O(1):插入、查找和删除操作的平均时间复杂度为常数时间。
  • 无序性:元素的存储是无序的,不会影响查找的效率。
  • 自动去重:相同的元素只会被存储一次。

结论

通过使用 unordered_set,我们能够快速高效地找到未出现的最小正整数,减少了不必要的计算和复杂度。这种方法适用于大多数数据处理场景,是数据结构和算法中的一种重要应用。

猜你喜欢

转载自blog.csdn.net/qq_37945670/article/details/143328804