526. 优美的排列
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :
perm[i] 能够被 i 整除
i 能够被 perm[i] 整除
给你一个整数 n ,返回可以构造的 优美排列 的 数量 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/beautiful-arrangement
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
回溯思想
每一位上的数都这样去做,遍历所有可以当前下标整除的或者被当前下标整除的数字,然后前进一位继续向后遍历,直到每个位置都有了满足要求的数字。
class Solution {
public int countArrangement(int n) {
return dfs(n,1,1);
}
public int dfs(int n, int index, int visited) {
if (index == n + 1){
return 1;
}
int ans = 0;
for (int i = 1; i <= n; i++) {
if ((index % i == 0 || i % index == 0) && (visited >> i & 1) == 0) {
ans += dfs(n,index+1,visited | 1 << i);
}
}
return ans;
}
}