用C语言缺失的第一个正数 给定一个未排序的整数数组 nums ,找出其中没有出现过的最小的正整数 要求:时间复杂度为O(n)
时间: 2024-05-05 18:20:49 浏览: 100
可以使用桶排序的思想来解决这个问题。具体来说,我们可以先对数组进行一次遍历,对于遍历到的数 x,如果它在 [1,n] 的范围内,就将数组中的第 x−1 个位置(注意:数组下标从 0 开始)打上「标记」。在遍历结束之后,如果数组中的每个位置都被打上了标记,那么答案是 n+1,否则答案是最小的没有打上标记的位置加 1。可以发现,最小的没有打上标记的位置也就是数组中第一个非正整数的位置,因此我们可以就地修改输入数组,把不在 [1,n] 范围内的数替换成任意一个大于 n 的正整数(例如 n+1),这样就可以减少空间复杂度的使用。
以下是代码实现:
```c
int firstMissingPositive(int* nums, int numsSize){
for (int i = 0; i < numsSize; i++) {
while (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i] - 1] != nums[i]) {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
for (int i = 0; i < numsSize; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return numsSize + 1;
}
```
阅读全文