个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
【C++】? ??
数据结构与算法
???????http://t.csdnimg.cn/hKh2l
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
题目
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组?perm
(下标从 1 开始),只要满足下述条件?之一?,该数组就是一个?优美的排列?:
perm[i]
?能够被?i
?整除i
?能够被?perm[i]
?整除给你一个整数?n
?,返回可以构造的?优美排列?的?数量?。
示例 1:
输入:n = 2 输出:2 解释: 第 1 个优美的排列是 [1,2]: - perm[1] = 1 能被 i = 1 整除 - perm[2] = 2 能被 i = 2 整除 第 2 个优美的排列是 [2,1]: - perm[1] = 2 能被 i = 1 整除 - i = 2 能被 perm[2] = 1 整除
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 15
题目的意思非常简单
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组?perm
(下标从 1 开始),只要满足下述条件?之一?,该数组就是一个?优美的排列?:
perm[i]
?能够被?i
?整除i
?能够被?perm[i]
?整除给你一个整数?n
?,返回可以构造的?优美排列?的?数量?。
示例 1:
输入:n = 2 输出:2 解释: 第 1 个优美的排列是 [1,2]: - perm[1] = 1 能被 i = 1 整除 - perm[2] = 2 能被 i = 2 整除 第 2 个优美的排列是 [2,1]: - perm[1] = 2 能被 i = 1 整除 - i = 2 能被 perm[2] = 1 整除
一、画出决策树
决策树就是我们后面设计函数的思路
二、设计代码
(1)全局变量
int ret;
bool check[16] = { false };
(2)设计递归函数
void dfs(int n, int pos)
递归流程如下
以上思路讲解完毕,大家可以自己做一下了
class Solution {
public:
int ret;
bool check[16] = { false };
void dfs(int n, int pos)
{
for (int i = 1; i <= n; i++)
{
if (check[i] == false && (i % pos == 0 || pos % i == 0))
{
if (pos == n)
{
ret++;
return;
}
check[i] = true;
dfs(n, pos + 1);
check[i] = false;
}
}
}
int countArrangement(int n)
{
dfs(n, 1);
return ret;
}
};