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

news/2024/11/19 13:28:44/

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++算法代码:

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++; // 找到一个满足条件的排列,将计数器加1return; // 返回上一层递归}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标记为未使用,以便在其他路径中使用}}}
};

http://www.ppmy.cn/news/1211600.html

相关文章

Python之文件与文件夹操作及 pytest 测试习题

目录 1、文本文件读写基础。编写程序&#xff0c;在 当前目录下创建一个文本文件 test.txt&#xff0c;并向其中写入字符串 hello world。2、编写一个程序 demo.py&#xff0c;要求运行该程序后&#xff0c;生成 demo_new.py 文件&#xff0c;其中内容与demo.py 一样&#xff0…

安装包 amd,amd64, arm,arm64 都有什么区别

现在的安装包也不省心&#xff0c;有各种版本都不知道怎么选。 根据你安装的环境配置。 amd&#xff1a; 32位X86 amd64&#xff1a; 64位X86 arm&#xff1a; 32位ARM arm64&#xff1a; 64位ARM amd64是X86架构的CPU&#xff0c;64位版。amd64又叫X86_64。主流的桌面PC&am…

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…

AJAX基础

<!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <title>AJAX</title> </head> <body> <!-- 什么是AJAX 定义AJAX是异步的JavaScript和XML&#xff0c; 简单点说&#xff0c;就是XMLHttpRequest对…

java 继承和多态 (图文搭配,万字详解!!)

目录 1.继承 1.1 为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 1.6 子类构造方法 1.7 super和this 1.8 再谈初始化 1.9 protected 关键字 1.10 继承方式 1.11 f…

Interactive Analysis of CNN Robustness

Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络&#xff08;CNN&#xff09;作为图像相关任务的最先进模型被广泛采用&#xff0c;但它们的预测往往对小的输入扰动高度敏感&#xff0c;而人类视觉对此具有鲁棒性。本文介绍了 Pert…

最新获取支付宝cardIndex参数图文教程

本章教程主要介绍如何获取支付宝的cardIndex参数。 目录 一、登录到支付宝官网 二、在历史记录中,找到对应用户 一、登录到支付宝官网

C++学习---信号处理机制、中断、异步环境

文章目录 前言信号处理signal()函数关于异步环境 信号处理函数示例raise()函数 前言 信号处理 关于信号&#xff0c;信号是一种进程间通信的机制&#xff0c;用于在程序执行过程中通知进程发生了一些事件。在Unix和类Unix系统中&#xff0c;信号是一种异步通知机制&#xff0c…