文章

117

粉丝

0

获赞

0

访问

5.5k

头像
2018年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年7月3日 17:54
阅读数 16

  1. 过滤与记录: 遍历一次数组,将所有大于0的数记录下来。由于我们只关心正整数,负数和零无需考虑。为了快速查找,可以使用一个布尔数组或者哈希集合(std::unordered_set 或 std::set)来存储这些正整数。

    • 如果使用布尔数组,其大小需要至少为n+1(因为最坏情况下,如果1到n都存在,答案就是n+1)。例如,我们可以考虑将 n 视为一个上限,如果数组中的最大正整数远超n,布尔数组会占用过多空间。然而,对于“未出现的最小正整数”这个问题,如果1到k都存在,而k+1不存在,那么答案就是k+1。如果数组大小为n,那么答案最大是n+1(当数组包含1到n时)。因此,一个大小为n+1的布尔数组是可行的,因为它能覆盖到1到n这个范围。对于大于n的整数,我们知道它们不会是“未出现的最小正整数”的候选者(因为我们正在找“最小”的)。
    • 如果使用哈希集合,则没有这种大小上的限制,但会带来额外的哈希计算开销。
  2. 查找缺失: 从1开始,逐个检查每个正整数 i 是否在记录中。

    • 如果 i 不在记录中,那么 i 就是未出现的最小正整数,返回 i
    • 如果 i 在记录中,则继续检查 i+1

(2)

#include <iostream>
#include <vector>
#include <unordered_set>

int findSmallestMissingPositiveInteger(const std::vector<int>& nums) {
    // 步骤1:过滤并记录数组中出现过的所有正整数
    std::unordered_set<int> seenPositiveNumbers;
    for (int num : nums) {
        if (num > 0) { // 只关心正整数
            ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发