Leetcode刷题详解——优美的排列

1. 题目链接:526. 优美的排列

2. 题目描述:

假设有从 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

3. 解法(递归):

3.1 算法思路:

我们需要在每个位置上考虑所有的可能情况并且不能出现重复。通过深度优先搜索的方式,不断地枚举每个数在当前位置的可能性,并且回溯到上一个状态,直到枚举完所有的可能性,得到正确的结果。

我们需要定义一个变量来记录所有可能的排列数量,一个一维数组标记元素,然后从第一个位置开始进行递归

3.2 递归流程:

  1. 递归结束条件:当pos等于n+1时,说明已经处理完所有的数字,将当前数组存入结果中
  2. 在每个递归状态中,枚举所有下标,若这个下标未被标记,并且满足题目条件之一:
    1. check[i]标记为true
    2. 对第pos+1个位置进行递归
    3. check[i]重新赋值为false,表示回溯

3.3 C++算法代码:

c++ 复制代码
class Solution {
    bool check[16]; // 用于记录每个数字是否已经被使用过
    int ret; // 用于记录满足条件的排列的数量
public:
    int countArrangement(int n) {
        dfs(1, n); // 从第一个位置开始搜索
        return ret; // 返回满足条件的排列的数量
    }
    void dfs(int pos, int n) {
        if (pos == n + 1) { // 如果已经到达最后一个位置
            ret++; // 找到一个满足条件的排列,将计数器加1
            return; // 返回上一层递归
        }
        for (int i = 1; i <= n; i++) { // 遍历从1到n的所有数字
            if (!check[i] && (pos % i == 0 || i % pos == 0)) { // 如果数字i未被使用过且满足排列的条件
                check[i] = true; // 将数字i标记为已使用
                dfs(pos + 1, n); // 继续搜索下一个位置
                check[i] = false; // 将数字i标记为未使用,以便在其他路径中使用
            }
        }
    }
};
相关推荐
小羊在睡觉2 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary2 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
jiayong232 小时前
面试中遇到不熟悉问题的应对策略深度解析
面试·职场和发展
好评笔记2 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466852 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
sheeta19983 小时前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
_日拱一卒3 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM3 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro4 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA社区4 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展