给定一个数组,从 1 到 n,找出数组中第一个没出现的正数。
例如:
给定[1,2,0]
,则返回 3。
给定[3,4,-1,1]
,则返回 2。
注意:
算法需要 \mathcal{O}(n)O(n) 的时间复杂度以及线性的空间复杂度。
输入格式
第一行输入整数 n(n \leq10^6)n(n≤106),接下来一行输入数组A[n]
。
输出格式
输出第一个没出现的正数。
样例输入
5
4 2 0 1 4
样例输出
3
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a[1000001]={0};
int tmp;
for(int i=0;i<n;i++){
scanf("%d", &tmp);
if(tmp>0) a[tmp]++;
}
for(int i=1;i<=n;i++){
if(a[i]==0){
printf("%d", i);
return 0;
}
}
}
思路:用一个大数组转换,hash的思想,每录入一个数字,都在这个大数组的相应位置+1,最后从前向后遍历整个数组,第一个为0的就是第一个没出现的正数了。反过来,假如题目要求输入的数字里比最大的数字大x的数字,那么就申请n+x大小的数组,然后从后向前遍历。不过这样似乎也可能对有负数输入的情况冲突,具体情况具体分析吧!
总结:思想最重要!