问题描述:给出一个长度为n的整数数组,通过函数得出数组中未出现的最小正整数。
格式:输入一行数组元素,输出一个未出现最小正整数。
输入样例:
[-5,2,4,3]
输出样例:
1
输入样例:
[1,2,3,3]
输出样例:
4
1.注意事项
1.从输入和输出样例可以发现规律,需要查找数组中正整数k从1开始递增,到数组中最大元素max+1的范围内,未出现最小的正整数。
2.从上面规律来看,采用穷举算法思想会比较简单,但整数范围较小时适用。
3.输入的数组中含有负数,因此需要对数组进行从小到大排序,并确定大于0的元素下标,从此下标开始进行操作。
4.由于数组a中含有重复元素,采用a数组中查找b数组中元素是否存在会可简化比较过程中的指针操作。
5.数组b是从1到max+1递增的正整数数组,从b取一个元素b[i],在整数a中查找是否存在,如果存在则将b[i]置零。若不存在即进行下一个比较。
最后输出数组b中第一个非零元素。
2.设计思想
首先对数组a进行从小到大的排序,确定大于0的数组a开始元素下标i,数组a中最大的元素max,那么数组b的范围是1~max+1,然后从数组a中查找b[i]是否存在,若b[i]存在,则b[i]置零,否则进行下一个b[i]的查找,最后对b数组进行遍历,查找第一个非零的元素即为未出现最小元素。
未出现最小正整数代码
void minPositiveInteger(){
int n=4;//数组大小
int a[n];//初始化数组
//数组输入赋值
printf("请输入数组:");
int i,j,k,temp,MAX,MIN;
for(i=0;i<n;i++){
if(i==0)
scanf("[%d,",&a[i]);
else if(i==n-1)
scanf("%d]",&a[i]);
else
scanf("%d,",&a[i]);
}
//对数组排序
for(i=0;i<n-1;i++){
temp=a[i+1];
j=i;
while(j>-1&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
printf("排序后数组:");
show(a,n);
i=0;
while(a[i]<=0){//获取数组a非零元素起始坐标
i++;
}
//初始化数组b
MAX=a[n-1]+1;//确定b数组大小范围
int b[MAX];
//b数组赋值
for(j=1;j<MAX+1;j++){
b[j-1]=j;
}
if(a[i]<1)//若a中最小正整数小于1,min即为1
MIN=1;
else{
//开始比较b数组中元素是否在a数组中存在和置零操作
for(j=0;j<MAX;j++){
temp=0;
for(k=i;k<n;k++){
if(b[j]==a[k]){
b[j]=0;
continue;
}
}
}
//获取未出现最小正整数
for(j=0;j<MAX;j++){
if(b[j]>0){
MIN=b[j];
break;
}
}
}
printf("未出现最小正整数:%d\n",MIN);
}
void show(int a[],int n){
//输出结果
int i;
for(i=0;i<n;i++){
if(i==0)
printf("[%d,",a[i]);
else if(i==n-1)
printf("%d]",a[i]);
else
printf("%d,",a[i]);
}
printf("\n");
}
3.结果测试