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之路的主要内容,如果未能解决你的问题,请参考以下文章