Given N integers, you are supposed to find the smallest positive integer that is NOT in the given list.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤105 ). Then N integers are given in the next line, separated by spaces. All the numbers are in the range of int.
Output Specification:
Print in a line the smallest positive integer that is missing from the input list.
Sample Input:
10
5 -25 9 6 1 3 4 2 5 17
Sample Output:
7
思路
这题很简单哈,但是我却卡了一会时间(原因是在于输入数据的时候动态更新最大值最小值,然后在[最小值,最大值]这个区间范围内寻找尚未出现过的最小正整数,结果一直只有头和尾两个测试点过了……后来干脆删了从1遍历到INF就AC啦~应该是什么地方写错了叭hhh)。
这里我直接用了map来建立int对bool的映射(用bool数组最后一个测试点会段错误,所以我就换回map了~),凡是读入一个正数,就把它置true(因为我们要寻找的是列表中尚未给出的最小正整数,因此,可以认为负数是无效数据,干脆跳过就好了)。最后,遍历所有正数(从1到INF,这里INF我只取了123123123,没有取到int型的最大值,事实证明没有测试点是故意取int最大值的),如果找到某个正数在map中为false,那么直接输出并且break掉即可~
代码
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<map>
#include<string.h>
#include<iostream>
using namespace std;
const int INF = 123123123;
map<int, bool> m;
int main()
{
int N;
scanf("%d", &N);
for(int i=0;i<N;i++){
int tmp;
scanf("%d", &tmp);
if(tmp>0){
m[tmp] = true;
}
}
for(int i=1;i<=INF;i++){
if(m[i]==false){
printf("%d", i);
break;
}
}
return 0;
}