要找出数组中未出现的最小正整数,可以使用以下步骤:
-
初始化一个布尔数组:创建一个布尔数组
exists
,其长度为n+1
(其中n
是给定数组的最大值),用于标记从 1 到n
的数字是否在数组中出现。 -
标记出现的数字:遍历给定的数组,对于数组中的每个数字
x
,将exists[x]
设置为true
。 -
找出未出现的最小正整数:从 1 开始遍历
exists
数组,找到第一个exists[i]
为false
的i
,这个i
就是未出现的最小正整数。
下面是一个简单的算法实现:
def firstMissingPositive(nums):
n = len(nums)
exists = [False] * (n + 1)
for i in range(n):
if nums[i] > 0 and nums[i] <= n:
exists[nums[i]] = True
for i in range(1, n + 1):
if not exists[i]:
return i
return n + 1
# 示例
nums = [3, 4, -1, 1]
print(firstMissingPositive(nums)) # 输出应该是 2
这个算法的时间复杂度是 O(n),空间复杂度也是 O(n),其中 n 是数组的长度。这种方法适用于未排序的数组,并且可以处理负数和大于数组长度的正数。
class Solution {
public:
/**
* return the min number
* @param arr int整型vector the array
* @return int整型
*/
int minNumberdisappered(vector<int>& arr) {
// write code here
int n = arr.size();
if (n == 0) {
return 1;
}
int nums[n];
for (int i=0; i<n; i++) {
nums[i] = 0;
}
for (int i=0; i<n; i++) {
if (arr[i] <= n && arr[i] > 0) {
nums[arr[i]-1] = 1;
}
}
for (int i=0; i<n; i++) {
if (nums[i] != 1) {
return i + 1;
}
}
return n + 1;
}
};