假设有从 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/beautiful-arrangement
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
总的排列是n!,我们需要在n!里面寻找符合条件的Case
fun countArrangement(n: Int): Int {
return helper(n, 1, 0)
}
private fun helper(n: Int, cur: Int, flag: Int): Int {
if (cur > n){
return 1
}
var result = 0
for (i in 1..n){
if ((flag and 1 shl i == 0) && (cur % i == 0 || i % cur == 0)){
result += helper(n,cur+1,flag or (1 shl i))
// println("$cur $i $result")
}
}
return result
}
1.这道题用dp去做的话,真的有点难
题解我都看了好几个人的 耐下心来看了3次以上 终于懵懂一点
2.比较简单的递归加For循环,其实也有很多人做不出来
这种题的操作就是for循环里面 还会有很多的for循环要写 那么就使用这种方法
3.dp方法今天看来想不通了 明天继续思考吧