public class Solution { //回溯法 //根据回溯的思路,同样,可以对本题的Beautiful排列实现。 //比如,当N为5时,使用回溯算法先是得到(1,2,3,4,5)排列,符合要求,符合要求的排列数count+1, //接着回溯到第四个位置,在剩下的选择中选5,但发现5不符合要求,然后跳过,不再往后判断。 //同样当得到(1,2,5)这前三个排列时,5已经不符合要求,也不会再往后判断(1,2,5,x,x)。 //这样减少了直接穷举递归方法中很多不需要判断操作,提高了效率。 int count = 0; public int CountArrangement(int N) { if (N == 0) return 0; helper(N, 1, new int[N + 1]); return count; } //具体来说,计算Beautiful排列的数量,可把长度为N的排列的位置看成结点, //建立一个辅助类来记录所遍历结点的位置及在该位置符合要求的值, //当结点的位置超过N长度则认为完成了一次Beautiful排列。 private void helper(int N, int pos, int[] used) { if (pos > N) { count++; return; } for (int i = 1; i <= N; i++) { if (used[i] == 0 && (i % pos == 0 || pos % i == 0)) { used[i] = 1; helper(N, pos + 1, used); used[i] = 0; } } } }
https://leetcode.com/problems/beautiful-arrangement/#/description