昆明理工大学2025年891计算机专业核心考研真题解析
昆明理工大学2025年891计算机考研真题解析 | 最小未出现正整数(附高效C++实现)
✨ 【昆明理工大学891计算机专业核心综合考研】 👨 作者:唐维康
题目描述
给定一个含n(n≥1)
个整数的数组,设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
示例:
-
输入:
{-5, 3, 2, 3}
→ 输出:1
-
输入:
{1, 2, 3}
→ 输出:4
-
给出算法的基本设计思想。
-
根据设计思想,采用C/C++语言描述算法,关键之处给出注释。
-
说明你所设计算法的时间复杂度和空间复杂度。
解题思路与代码实现
1. 算法设计思想
🔥 核心目标:时间复杂度O(n)
,空间复杂度O(1)
✅ 关键步骤:
-
原地哈希:利用数组本身记录正整数出现情况,将数值
x
映射到索引x-1
的位置。 -
两次遍历:
-
第一次遍历:将合法的正整数交换到正确位置。
-
第二次遍历:找出第一个“位置不匹配”的索引,其对应值即为结果。
-
-
边界处理:若所有位置均匹配,则结果为数组长度
+1
。
2. C++代码实现
#include <vector>using namespace std;int findMissingMinPositive(vector<int>& nums) {int n = nums.size();// 第一次遍历:将正整数放到正确的位置for (int i = 0; i < n; ++i) {// 若当前数在合法范围内,且未在正确位置,则交换while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {swap(nums[i], nums[nums[i] - 1]);}}// 第二次遍历:寻找第一个不匹配的位置for (int i = 0; i < n; ++i) {if (nums[i] != i + 1) {return i + 1;}}// 所有位置均匹配,返回n+1return n + 1;}
3. 复杂度分析
-
时间复杂度:
O(n)
每个元素最多被交换一次,两次遍历均为
O(n)
。 -
空间复杂度:
O(1)
原地修改数组,未使用额外空间。
真题解析示例
示例1:输入{-5, 3, 2, 3}
-
第一次遍历后数组变为
{2, 3, -5, 3}
(数字1
未出现)。 -
第二次遍历发现
nums[0]=2≠1
,返回1
。
示例2:输入{1, 2, 3}
-
数组已经是
{1, 2, 3}
,所有位置匹配。 -
返回
3+1=4
。
💥 获取完整真题集及答案解析请看水印!