526. 优美的排列
假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:
第 i 位的数字能被 i 整除
i 能被第 i 位上的数字整除
现在给定一个整数 N,请问可以构造多少个优美的排列?
说明: N < = 15 N<=15 N<=15;
思路:
这个题目有点像dfs搜全排列,但是对于每一位的数有限制条件。如果我们搜出全部的全排列在判断必然会超时。
但是我们可以先筛出满足条件的数,然后放到每一位上去。
code:
class Solution {
public:
vector<vector<int>> ans;//存可以用的数
vector<int> vis;//记录是否用过
int num;//存最终答案
void dfs(int pos,int n){
if(pos==n+1){
num++;
return;
}
for(auto &x:ans[pos]){
if(!vis[x]){
vis[x]=true;
dfs(pos+1,n);
vis[x]=false;//恢复现场
}
}
}
int countArrangement(int n) {
vis.resize(n+1);
ans.resize(n+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i%j==0||j%i==0){
ans[i].push_back(j);
}
}
}
dfs(1,n);
return num;
}
};