给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C、C++或Java语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
核心代码
思路:
时间复杂度O(n) 空间复杂度O(n)
/*给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C、C++或Java语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
*/
#include <iostream>
using namespace std;
int findMissMin(int A[],int n) {
int i,*B; //新建一个数组作为标记数组
B=new int [n]; //动态分配
for(i=0;i<n;i++)B[i]=0; //赋初值0
for(i=0;i<n;i++)
if(A[i]>0 && A[i]<=n) //若A[i]的值介于1~n,则标记数组B
B[A[i]-1]=1;
for(i=0;i<n;i++) //扫描数组B,找到目标值
if(B[i]==0)break;
return i+1;
}
int main(){
int n,i,result;
cout<<"请输入数组长:"; cin>>n;
int A[n];
cout<<"输入A数组中元素:";
for ( i = 0; i < n; i++) cin >> A[i];
cout<<"A数组为:"; for ( i = 0; i < n; i++) cout<< A[i]<<"\t";
cout<<endl;
result=findMissMin(A,n);
cout<<"未出现的最小正整数是:";
cout<<result<<endl;
return 0;
}
测试样例