题目描述
给定一个含有 n
个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如:
- 输入:
{-5, 3, 2, 3}
- 输出:
1
- 输入:
{1, 2, 3}
- 输出:
4
思路分析
我们需要找到数组中未出现的最小正整数。根据题目的要求,可以采取以下步骤:
- 过滤无效数据:只考虑正整数,负数和零不影响我们寻找最小正整数的结果。
- 使用哈希集合:我们可以用哈希表(
unordered_set
)来存储数组中的正整数,方便快速查找。 - 从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;
}
代码讲解
-
导入库:我们使用
#include "bits/stdc++.h"
,这是一个常用的头文件,包含了大多数标准库。 -
min
函数:接收一个整数向量
value
,返回未出现的最小正整数。
- 创建一个
unordered_set<int> sets
用于存储正整数。 - 遍历
value
中的每一个元素,插入到集合中。
- 创建一个
-
查找最小正整数
:
- 初始化
minValue
为1,从1开始查找。 - 使用
sets.count(minValue)
来检查当前的minValue
是否存在于集合中。如果存在,说明当前数字已经出现,继续加1,直到找到未出现的数字。
- 初始化
-
主函数:测试
min
函数的实现,输出结果。扫描二维码关注公众号,回复: 17425376 查看本文章
unordered_set
使用介绍
unordered_set
是 C++ STL 中的一个容器,基于哈希表实现。与其他集合容器相比,它具有以下优点:
- 平均时间复杂度为 O(1):插入、查找和删除操作的平均时间复杂度为常数时间。
- 无序性:元素的存储是无序的,不会影响查找的效率。
- 自动去重:相同的元素只会被存储一次。
结论
通过使用 unordered_set
,我们能够快速高效地找到未出现的最小正整数,减少了不必要的计算和复杂度。这种方法适用于大多数数据处理场景,是数据结构和算法中的一种重要应用。