LeetCode 526 优美的排列[dfs 回溯] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 526 优美的排列[dfs 回溯] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
一道需要经过预处理的回溯类型题目,首先我们要找出不同位置上有哪些数是符合要求的,这就需要构建一个二维数组match,接着就是从位置1开始遍历,遍历每一个符合要求的数,然后看第二个合不合适,不断递归,其中对于遍历过的点需要标记,在回溯的时候需要复原,代码如下:

class Solution {
private:
    vector<vector<int>> match;
    vector<bool> visited;
    int num = 0;
    int len;
public:
    int countArrangement(int n) {
        len = n;
        match.resize(len + 1);
        visited.resize(len + 1, false);
        // 从位置i开始
        for(int i = 1; i <= len; i ++) {
            // 是否选择j数
            for(int j = 1; j <= len; j ++) {
                if(i % j == 0 || j % i == 0) {
                    match[i].push_back(j);
                }
            }
        }
        dfs(1);
        return num;
    }

    void dfs(int index) {
        if(index == len + 1) {
            num ++;
            return;
        }
        // 找位置为index时合适的数
        for(int& m : match[index]) {
            // 如果没访问
            if(!visited[m]) {
                visited[m] = true;
                // 看位置index + 1选择哪个数合适
                dfs(index + 1);
                visited[m] = false;
            }
        }   
    }
};

以上是关于LeetCode 526 优美的排列[dfs 回溯] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

526. 优美的排列(dfs)

leetcode-526 优美的排列

LeetCode 576. 出界的路径数(动规) / 526. 优美的排列(全排列,状压dp)

526. 优美的排列

leetcode算法题基础(四十三) 回溯算法总结

优美的排列--回溯解决