📅  最后修改于: 2023-12-03 15:26:38.481000             🧑  作者: Mango
在给定的无序整数数组中,找到最小的正整数,该正整数在该数组中不存在。例如,对于数组 [1, 2, 0],返回 3;对于数组 [3, 4, -1, 1],返回 2。
这个问题可以用哈希表来解决,但是这个方法需要使用额外的空间。以下是使用 C++ 的原地解决方案:
int smallestMissingNumber(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;
}
}
return n + 1;
}
这个算法的时间复杂度是 O(n),空间复杂度是 O(1)。它的思想是把每个数交换到它应该在的位置上。最终我们只需要扫描一遍整个数组找到第一个位置与数值不匹配的位置就可以了。
下面是测试代码:
int main() {
vector<int> nums1 = {1, 2, 0};
vector<int> nums2 = {3, 4, -1, 1};
cout << smallestMissingNumber(nums1) << endl; // expect 3
cout << smallestMissingNumber(nums2) << endl; // expect 2
return 0;
}