一、题目
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm
(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :
perm[i]
能够被i
整除i
能够被perm[i]
整除
给你一个整数 n
,返回可以构造的 优美排列 的 数量 。
示例 1:
输入:n = 2 输出:2 解释: 第 1 个优美的排列是 [1,2]: - perm[1] = 1 能被 i = 1 整除 - perm[2] = 2 能被 i = 2 整除 第 2 个优美的排列是 [2,1]: - perm[1] = 2 能被 i = 1 整除 - i = 2 能被 perm[2] = 1 整除
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 15
二、思路解析
这道题一看就是用递归解决的,因为求都的是一个数能否被另一个数整除,相同的子问题就试试递归。
而递归的每一层,其实本质就是,把还没递归过的元素加入递归的过程中,所以要用到一个 check 数组,来判断每个元素是否已经使用过。
然后就是传到下一层和熟悉的剪枝了。
三、完整代码
class Solution {
boolean check[];
int ret;
public int countArrangement(int n) {
check = new boolean[n + 1];
dfs(1 , n);
return ret;
}
public void dfs(int pos , int n){
if(pos == n + 1){
ret ++;
return;
}
for(int i = 1 ; i <= n ; i ++){
if((check[i] == false) && (pos % i == 0 || i % pos == 0)){
check[i] = true;
dfs(pos + 1 , n);
check[i] = false;
}
}
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!