给定一个含n(n>1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是。用c语言实现
时间: 2024-05-02 11:22:20 浏览: 119
google interview question new list
好的,让我来为您回答这道问题。针对这个问题,我会给您一个基于桶排序的算法实现。
首先,我们可以把数组中所有小于等于0的数都置为INT_MAX,因为这些数不可能是未出现的最小正整数。
然后,我们可以使用桶排序的思想,把每个数更新到对应的位置上。具体来说,假设当前处理到的数为x,那么我们可以把对应的位设为负数,表示x已经出现过。注意,如果x>n,那么它也不可能是未出现的最小正整数,我们可以直接忽略它。
最后,我们遍历数组,找到第一个正数对应的位置,即为未出现的最小正整数。如果不存在这样的数,那么最小正整数就是n+1。
下面是具体的C语言代码实现:
```c
int findMinPositive(int* nums, int numsSize) {
int i;
// 处理非正整数
for (i = 0; i < numsSize; ++i) {
if (nums[i] <= 0) {
nums[i] = INT_MAX;
}
}
// 更新桶
for (i = 0; i < numsSize; ++i) {
int x = abs(nums[i]);
if (x <= numsSize && nums[x - 1] > 0) {
nums[x - 1] = -nums[x - 1];
}
}
// 找到最小正整数
for (i = 0; i < numsSize; ++i) {
if (nums[i] > 0) {
return i + 1;
}
}
return numsSize + 1;
}
```
这个算法的时间复杂度是O(n),空间复杂度也是O(n)。
阅读全文