给定一个数组,找出第一个缺失的正数,要求时间复杂度为O(n)即只使用一层循环,常数大小的额外空间 输入输出格式 printf("Please input the arraysize\n"); scanf("%d",); for() { printf("Please input the %d-th number\n",i); scanf("%d"); } printf("values are %d\n"); 函数原型 int firstMissingPositive(int* nums, int numsSize) 程序示例1 Please input the arraysize 3 Please input the 0-th number 1 Please input the 1-th number 2 Please input the 2-th number 0 values are 3 注:不考虑非法输入 程序示例2 Please input the arraysize↙ 4 Please input the 0-th number↙ 5 Please input the 1-th number↙ 3 Please input the 2-th number↙ 8 Please input the 3-th number↙ 9 values are 1↙
时间: 2024-02-23 11:02:20 浏览: 62
好的,让我来解答你的问题。
这里可以使用桶排序的思想。我们将数组中的每个数放到对应的位置上,即将数字i放到nums[i-1]的位置上。然后再遍历一遍数组,找到第一个不满足nums[i]==i+1的位置i,返回i+1即可。如果整个数组都满足这个条件,则返回数组长度+1。
下面是代码实现:
```c
int firstMissingPositive(int* nums, int numsSize) {
int i = 0;
while (i < numsSize) {
if (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i]-1] != nums[i]) {
int tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
} else {
i++;
}
}
for (i = 0; i < numsSize; i++) {
if (nums[i] != i+1) {
return i+1;
}
}
return numsSize+1;
}
```
在输入输出部分,可以参考以下代码:
```c
int main() {
int n;
printf("Please input the arraysize\n");
scanf("%d", &n);
int nums[n];
for (int i = 0; i < n; i++) {
printf("Please input the %d-th number\n", i);
scanf("%d", &nums[i]);
}
printf("values are ");
for (int i = 0; i < n; i++) {
printf("%d ", nums[i]);
}
printf("\n");
printf("The first missing positive is %d\n", firstMissingPositive(nums, n));
return 0;
}
```
希望能够解决你的问题!
阅读全文