leetcode526

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

原文地址:https://www.cnblogs.com/asenyang/p/6795735.html