题目描述

输入样例
[-5,1000,3,3,1]
输出样例
2
算法 时间复杂度:O(n)O(n)O(n) (遍历了整个数组) 空间复杂度:O(n)O(n)O(n) (使用了一个b数组)
用一个数组b来判断在数组中数值为[1,n]的数是否出现过。
这个数组b就类似于图论中的st数组用来判断一个点是否被遍历过。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int MaxSize = 100;
int findMinNum(int q[],int len)
{
int idx=-1,*b;
b=(int*)malloc(sizeof(int)*n); //设计一个b的指针数组,用于判断[1,n]之间的数是否在数组中出现过
memset(b,0,sizeof *b); //b的大小就是n,每个值初始设为0
for(int i=0;i<len;i++)
{
if(q[i]>=0 && q[i]<=len)
{
b[q[i]-1]=1;
}
}
for(int i=0;i<len;i++) //在b数组中查找没有被遍历过的正整数
{
if(!b[i])
{
idx=i+1; //由于b的下标是0~n-1,所以返回值应该加1,这样就表示了[1,n]这个区间了
break;
}
}
if(idx==-1) idx=len;
return idx;
}
int main()
{
int n = 0;
int a[MaxSize]={-5,1000,3,3,1};
printf("%d",findMinNum(a,5));
return 0;
}
该博客介绍了一个算法问题,即在给定的整数数组中找到第一个未出现的正整数。算法通过遍历数组并使用额外的辅助数组记录正整数的出现情况,然后在辅助数组中寻找第一个值为0的索引,该索引加1即为缺失的最小正整数。代码实现使用C++,时间复杂度和空间复杂度均为O(n)。
365

被折叠的 条评论
为什么被折叠?



