给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。用c语言实现并输出
时间: 2024-02-25 21:56:10 浏览: 53
好的,针对你的问题,我可以给出一个时间复杂度为O(n)的算法,并用C语言实现并输出结果。
算法思路:
1. 遍历一遍数组,将所有小于等于0的数都变成n+1,因为最小正整数一定在1~n+1之间。
2. 再遍历一遍数组,对于每个数x,如果|x|<=n,则将数组中第|x|个数变成负数,表示x这个数出现过。
3. 最后再遍历一遍数组,找到第一个正数,它的下标+1就是最小未出现的正整数。
下面是C语言的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
int findMinPositive(int* nums, int numsSize){
for(int i = 0; i < numsSize; i++){
if(nums[i] <= 0){
nums[i] = numsSize + 1;
}
}
for(int i = 0; i < numsSize; i++){
int x = abs(nums[i]);
if(x <= numsSize && nums[x-1] > 0){
nums[x-1] = -nums[x-1];
}
}
for(int i = 0; i < numsSize; i++){
if(nums[i] > 0){
return i+1;
}
}
return numsSize+1;
}
int main(){
int nums1[] = {-5, 3, 2, 3};
int nums2[] = {1, 2, 3};
int nums3[] = {0, 2, 2, 1, 1};
int n1 = sizeof(nums1) / sizeof(nums1[0]);
int n2 = sizeof(nums2) / sizeof(nums2[0]);
int n3 = sizeof(nums3) / sizeof(nums3[0]);
printf("数组{-5, 3, 2, 3}中未出现的最小正整数是:%d\n", findMinPositive(nums1, n1));
printf("数组{1, 2, 3}中未出现的最小正整数是:%d\n", findMinPositive(nums2, n2));
printf("数组{0, 2, 2, 1, 1}中未出现的最小正整数是:%d\n", findMinPositive(nums3, n3));
return 0;
}
```
输出结果:
```
数组{-5, 3, 2, 3}中未出现的最小正整数是:1
数组{1, 2, 3}中未出现的最小正整数是:4
数组{0, 2, 2, 1, 1}中未出现的最小正整数是:3
```
以上就是实现代码和输出结果,希望能对你有所帮助。
阅读全文