给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。由上面的递推式容易写出如下的递归函数.
void ArrayF(int* A,int n,int Sum) { if(!A || n < 1 || Sum < 1)//处理异常,A==NULL,n <=0,Sum<1 return ; if( n==1 ) { A[0]=Sum; for(int i=0;i<Len;++i) cout<<A[i]<<' '; cout<<endl; } else { for(int i=0;i<=Sum;++i) { A[n-1]=i; ArrayF(A,n-1,Sum-i); } } }由上面的函数求出所有的可能输出之后,再写一个函数判断输出序列是否满足条件即可.
时间复杂度为o(n^2),也可以用一个哈希表降低时间复杂度,但是,那样空间复杂度将会是o(n),时间复杂度是o(n).
bool isLegal(int* A,int n) { for(int i=0;i<n;++i) { int count=0; for(int j=0;j<n;++j) { if(i==A[j]) ++count; } if(A[i] != count) return false; } return true; }
完整代码如下: #include<iostream> using namespace std; const int Len = 4; bool isLegal(int* A,int n) { for(int i=0;i<n;++i) { int count=0; for(int j=0;j<n;++j) { if(i==A[j]) ++count; } if(A[i] != count) return false; } return true; } void ArrayF(int* A,int n,int Sum) { if(!A || n < 1 || Sum < 1)//处理异常,A==NULL,n <=0,Sum<1 return ; if( n==1 ) { A[0]=Sum; if(isLegal(A,Len)) { for(int i=0;i<Len;++i) cout<<A[i]<<' '; cout<<endl; } } else { for(int i=0;i<=Sum;++i) { A[n-1]=i; ArrayF(A,n-1,Sum-i); } } } void main() { int A[20]={0}; ArrayF(A,Len,Len); }