【Codeforces Round #665 (Div. 2) D】Maximum Distributed Tree
阿新 • • 發佈:2020-12-27
P21 13題(408-2018統考真題)
第一種解法(正確答案):
int findMissMin(int A[],int n){
int i,*B;
//動態分配空間
B=(int *)malloc(sizeof(int)*n);
memset(B,0,sizeof(int)*n);//對陣列進行賦值,並將其全部賦值為0
for(i=0;i<n;i++){
if(A[i]>0 && A[i]<n)
//將陣列A中的正整數,存到陣列B中,並將陣列A的值作為陣列B的下標,由於下標是從0開始的,所以陣列A的值需要減一
//用這種方式將陣列A中的元素進行排序,例如陣列:-5,-3,2,4
//B[1]=1;B[3]=1;於是可以看出B中缺B[0]等,於是從i最小開始B[i]=i+1;
B[A[i]-1]=1;
}
for(int i=0;i<n;i++)
if(B[i]==0)
break;
//如果陣列B中的元素全都大於0,即為1,即陣列A中的元素全部為正整數,還是看少哪個i,然後輸出i+1
return i+1;
}
時間複雜度O(n);空間複雜度O(n)(因為開闢出了一個B陣列,大小為n)
第二種解法(未執行過)
SearchMin(int A[].int x){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if( A[j]>A[j+1]){
int temp;
temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
}
for(int i=0;i<n;i++){
int m=1;
if(A[i]>0)
if(A[i]==m)
m++;
else
printf(未出現的最小正整數為m);
if(i>=n)
printf(未出現的最小正整數為m);
演算法思想:先對陣列進行排序,然後找出未出現的最小正整數。
時間複雜度O(n^2),空間複雜度(1);