这道题定义了一个概念--优美排列,也就是从1到N的N个数的排列,任意位置符合2个条件中的任意一个。假设数组A为N个数的排列,数组的i索引从1开始。
条件:1、 A[i] % i == 0 2、 i % A[i] == 0
解答:
可以用递归找出N个数的所有排列,并在最后检测符合条件的排列,并计算符合条件排列的个数,但这样复杂度比较高,为N!。
我们可以用剪枝减小算法复杂度,如果一个位置不符合条件就不让递归,那递归结束后的排列就全符合条件了,这道题让算符合条件的个数,所以不用记录符合条件的排列。
1 用res记录符合条件排列个数,当递归结束后表明当前排列符合条件,res + 1
2 用pos记录当前递归的位置,并且如果当前位置不符合条件时剪枝
3 当当前位置为N + 1时,表明前N个位置数据都符合条件,递归结束,res + 1
int res = 0;
public int countArrangement(int N) {
boolean[] visited = new boolean[N + 1];
dfs(N, 1, visited);
return res;
}
private void dfs(int N, int pos, boolean[] visited) {
if (pos == N + 1) {
res++;
}
for (int i = 1; i <= N; i++) {
if (!visited[i] && (i % pos == 0 || pos % i == 0)) {
visited[i] = true;
dfs(N, pos + 1, visited);
visited[i] = false;
}
}
}