526. 优美的排列

115 阅读1分钟

526. 优美的排列

回溯

  • dfs(1); 安排值为1的位置,可以是小标1 ~ n,n中情况
  • for (var i = 1; i <= n; i++) { 下标 从1n
  • if (!arr[i]) {默认情况下arr[i]false
  • if (x % i == 0 || i % x == 0) { 如果满足完美要求,则设置i位置为已经处理,用arr[i]记录下状态,然后进一步探索
  • 当选择好了dfs(1)后,于是确定了一个下标,然后在arr[i]中做好笔记,然后进一步安排dfs(2),从剩下的空位中找一个坑,然后标记他的位置,。。。。。直到把最后一个安排好了就记录一次结果res++,处理好了余下的情况,就回溯,将状态恢复一下arr[i] = false;
var countArrangement = function (n) {
    var res = 0;
    var arr = new Array(n + 1).fill(false)
    dfs(1);
    return res;
    function dfs(x) {
        if (x > n) return res++;
        for (var i = 1; i <= n; i++) {
            if (!arr[i]) {
                if (x % i == 0 || i % x == 0) {
                    arr[i] = true;
                    dfs(x + 1)
                    arr[i] = false;
                }
            }
        }
    }
};