请用C语言给出一个时间上尽可能高效的算法,找出数组中未出现的最小正整数
时间: 2024-04-26 18:26:09 浏览: 109
一个未排序的整数数组,请找出其中没有出现的最小的正整数。
5星 · 资源好评率100%
下面是一个时间复杂度为 O(n) 的算法,用于找出数组中未出现的最小正整数:
```c
#include <stdio.h>
int findMissingPositive(int arr[], int length) {
// 将所有负数和零都设置为一个大于length的数,使其不影响结果
for (int i = 0; i < length; i++) {
if (arr[i] <= 0) {
arr[i] = length + 1;
}
}
// 标记已存在的正整数
for (int i = 0; i < length; i++) {
int num = abs(arr[i]);
if (num <= length) {
arr[num - 1] = -abs(arr[num - 1]);
}
}
// 找到第一个未标记的正整数
for (int i = 0; i < length; i++) {
if (arr[i] > 0) {
return i + 1;
}
}
// 如果数组中的所有正整数都已标记,则返回length+1
return length + 1;
}
int main() {
int arr[] = {3, 4, -1, 1};
int length = sizeof(arr) / sizeof(arr[0]);
int missingPositive = findMissingPositive(arr, length);
printf("数组中未出现的最小正整数为:%d\n", missingPositive);
return 0;
}
```
该算法的思路是通过遍历数组,将所有非正整数(负数和零)都设置为一个大于length的数,这样它们不会影响到最后的结果。然后,再次遍历数组,将出现的正整数对应的索引位置的数标记为负值。最后,再次遍历数组,找到第一个未标记的正整数,即为未出现的最小正整数。
在该算法中,通过遍历数组三次,实现了线性时间复杂度 O(n),其中 n 是数组的长度。
希望这个算法能满足您的需求!
阅读全文