代码:
class Solution {
public:
int binarysearch(vector<int>& A,int target,int begin,int end){
if(begin>end) return -1;
int mid=(begin+end)/2;
if(A[mid]==target) return mid;
else if(A[mid]>target) return binarysearch(A,target,begin,mid-1);
else return binarysearch(A,target,mid+1,end);
}
int numFactoredBinaryTrees(vector<int>& A) {
int mod=1e9+7;
sort(A.begin(),A.end());
int n=A.size();
if(n==1) return 1;
long int mem[n];//动态规划数组
mem[0]=1;//初始化
int ans=1;
for(int i=1;i<n;i++){
mem[i]=1;//初始化,至少可以有自己一个
for(int j=0;A[j]<=A[i]/A[j];j++){
if(A[i]%A[j]==0){
int temp=binarysearch(A,A[i]/A[j],j,i);
if(temp==j){
mem[i]=(mem[i]+mem[j]*mem[j])%mod;
}
else if(temp!=-1){
mem[i]=((((mem[j]*mem[temp])%mod)*2)%mod+mem[i])%mod;
}
}
}
ans=(ans+mem[i])%mod;
}
return ans;
}
};
复杂度分析:
时间复杂度:第一层循环是n,第二层循环是根号n,二分查找要logn,因此总的时间复杂度为(n^1.5)*logn,