【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 全排列(难度⭐⭐)(62)

news/2024/9/20 1:30:41/ 标签: leetcode, 剪枝, 算法, c++, 动态规划

1. 题目解析

题目链接:46. 全排列

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。当候选解被确认不是一个解(或者至少不是最后一个解)时,回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”并尝试另一个可能的解。

对于全排列问题,典型的回溯算法应用体现在:需要在每个位置上考虑所有可能的情况,并且不能出现重复的元素。通过深度优先搜索的方式,我们不断地枚举每个数在当前位置的可能性,并回溯到上一个状态,直到枚举完所有可能性,得到正确的结果。

在实现全排列时,我们可以使用一个递归函数backtrack,并借助一个标记数组visited来实现。visited数组用于判断当前数字是否已经在之前的排列中出现过。

下面是回溯算法解决全排列问题的具体步骤:

  1. 初始化

    • 定义一个二维数组res用于存放所有可能的排列结果。
    • 定义一个一维数组ans用于存放当前状态下的排列。
    • 定义一个一维数组visited用于标记数字是否已经被使用。
    • 定义两个整数变量steplen,分别表示当前需要填入的位置和数组的长度。
  2. 递归函数设计void backtrack(vector<vector<int>>& res, vector<int>& nums, vector<bool>& visited, vector<int>& ans, int step, int len)

    • 递归结束条件:当step等于len时,说明我们已经处理完了所有数字,将当前ans数组存入res中。
    • 枚举所有可能性:对于当前step位置,遍历所有未标记的数字nums[i](即visited[i]false)。
      • 标记当前数字visited[i]true
      • nums[i]放入ans数组的step位置。
      • 对下一个位置step+1进行递归调用。
      • 回溯:将visited[i]重新设为false,并将ans数组的step位置恢复为之前的值(如果需要的话)。
  3. 调用递归函数:从第一个位置(step=0)开始调用递归函数。

  4. 返回结果:最终返回存放所有排列结果的res数组。

此外,我们还可以采用另一种不使用visited数组的方式来实现全排列。具体做法是:直接遍历step之后的元素(即未被使用的元素),然后将其与需要递归的位置进行交换。这样,每次递归调用时,我们只需要考虑当前位置之后的元素,而不需要额外维护一个标记数组。这里就不细讲这种写法啦~

3.代码编写

class Solution 
{vector<vector<int>> ret;vector<int> path;bool cheak[7];
public:vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}void dfs(vector<int>& nums){if(nums.size() == path.size()){ret.push_back(path);return;}for(int i = 0; i < nums.size(); i++){if(cheak[i] == false){path.push_back(nums[i]);cheak[i] = true;dfs(nums);path.pop_back();cheak[i] = false;}}}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 


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

相关文章

IDEA上配置Maven环境

1.选择IDEA中的Setting 2.搜索maven 3.设置IDEA使用本地安装的Maven&#xff0c;并修改配置文件路径 配置文件&#xff0c;本地仓库&#xff0c;阿里云仓库配置及路径教程 在IDEA上配置完成。

1. 2XX (Success 成功状态码)

状态码2XX表示请求被正常处理了。 &#xff08;1&#xff09;200 OK 200 OK表示客户端发来的请求被服务器端正常处理了。 &#xff08;2&#xff09;204 No Content 该状态码表示客户端发送的请求已经在服务器端正常处理了&#xff0c;但是没有返回的内容&#xff0c;响应报…

AlgorithmDay20

day20 [!NOTE] return用作&#xff1a;return递归的上一层&#xff0c;而不一定一定是最后结果。 654.最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视频&#xff0c;好好体会一下 为什么…

c++补充

构造函数、析构函数 #include <iostream> using namespace std;// 构造函数、析构函数 // --- "构造函数"类比生活中的"出厂设置" --- // --- "析构函数"类比生活中的"销毁设置" --- // 如果我们不写这两种函数&#xff0c;编译…

OpenHarmony多媒体-metadata-extractor

简介 metadata-extractor是用于从图像、视频和音频文件中提取 Exif、IPTC、XMP、ICC 和其他元数据的组件。 下载安装 ohpm install ohos/metadata-extractorOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 。 使用说明 引入文件及代码依…

深入理解Java消息中间件-消息的过滤和选择

在我们如今这个数据驱动的时代&#xff0c;从无数的信息中准确地过滤和选择出对我们最有价值的消息&#xff0c;是业务和技术领域中不可或缺的一个环节。本文我们将探讨消息的过滤和选择是如何实现的&#xff0c;同时简要介绍其背后的原理。 理解消息过滤和选择的重要性 首先…

Maven的下载和环境变量的配置

1下载 maven官网https://maven.apache.org/index.html点击Download 这个是Windows的下载版本&#xff0c;一般是最新的版本&#xff0c; 老的版本下载 以下是对应的老版本下载链接 下载好后是一个压缩包的形式 点击他进行解压到想放的文件夹中&#xff0c;&#xff08;一般不…

Maven基础篇3

Maven进阶 –分模块开发与设计 –聚合 –继承 –属性 –私服 1.分模块开发与设计 开发的时候是分包开发 一个人完成一个包即可&#xff1b; 甚至一个包需要多个人开发&#xff1b;需要对包进行拆分&#xff1b; 也就是将我们一个包的东西&#xff0c;拆分成一个工程&a…

神经网络进阶学习文章(一)

1.讲解YOLO有关知识 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎 (zhihu.com) 2.目标检测算法综述 目标检测算法综述 - 知乎 (zhihu.com) 3.TensorFlow详解&#xff0c;当然现在用的最多的是Pytorch框架了 谷歌大神带你十分钟看懂TensorFlow - 知乎 (zhihu.co…

ROS1快速入门学习笔记 - 04创建工作环境与功能包

一、定义 工作空间(workspace)是一个存放工程开发相关文件的文件夹。 src:代码空间&#xff08;Source Space&#xff09;build: 编辑空间&#xff08;Build Space&#xff09;devel:开发空间&#xff08;Development Space&#xff09;install:安装空间&#xff08;Install …

Laravel 6 - 第十六章 Artisan命令

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

Linux shell编程学习笔记47:lsof命令

0 前言 今天国产电脑提示磁盘空间已耗尽&#xff0c;使用用df命令检查文件系统情况&#xff0c;发现/dev/sda2已使用100%。 Linux shell编程学习笔记39&#xff1a;df命令https://blog.csdn.net/Purpleendurer/article/details/135577571于是开始清理磁盘空间。 第一步是查看…

服务器防入侵的方案浅析

随着物联网技术和互联网技术的日益发展&#xff0c;勒索病毒、工控安全、产线作业都面领着极大的威胁。智慧互联正在成为各个行业未来的发展方向&#xff0c;智慧互联包括物联网、万物互联&#xff0c;机器与机器&#xff0c;工业控制体系&#xff0c;信息化&#xff0c;也就是…

XiaodiSec day007 Learn Note 小迪安全学习笔记

XiaodiSec day007 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 07 2023.12.31 cms识别 资产泄漏&#xff0c;资产即为网站的资源&#xff0c;了解到网站使用了那种cms对信息收集很有帮助 使用工具识别cms 识别cms后可以进行代码审计&#xff0c;或…

【RAG 论文】面向知识库检索进行大模型增强的框架 —— KnowledGPT

论文&#xff1a;KnowledGPT: Enhancing Large Language Models with Retrieval and Storage Access on Knowledge Bases ⭐⭐⭐⭐ 复旦肖仰华团队工作 论文速读 KnowledGPT 提出了一个通过检索知识库来增强大模型生成的 RAG 框架。 在知识库中&#xff0c;存储着三类形式的知…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记&#xff1a; 事务的基本概念 事务 定义 用户定义的一个数据库操作系列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交&#xff0c;提交事务的所有操作 ROLLBACK 回滚&#xff0c…

BM25检索算法 python

1.简介 BM25&#xff08;Best Matching 25&#xff09;是一种经典的信息检索算法&#xff0c;是基于 TF-IDF算法的改进版本&#xff0c;旨在解决、TF-IDF算法的一些不足之处。其被广泛应用于信息检索领域的排名函数&#xff0c;用于估计文档D与用户查询Q之间的相关性。它是一种…

【AngularJs】前端使用iframe预览pdf文件报错

<iframe style"width: 100%; height: 100%;" src"{{vm.previewUrl}}"></iframe> 出现报错信息&#xff1a;Cant interpolate: {{vm.previewUrl}} 在ctrl文件中信任该文件就可以了 vm.trustUrl $sce.trustAsResourceUrl(vm.previewUrl);//信任…

CSS基础——1.CSS样式

CSS 是“Cascading Style Sheet”的缩写,中文意思为“层叠样式表”,用于描述网页的表现形式(例如网页元素的位置、大小、颜色等。css的主要作用是定义网页的样式 CSS样式 1. 行内样式 行内样式:直接定义在 HTML 标签的 style 属性中 <!DOCTYPE html> <html la…

文件读取和写入

1、with open 和 open close 的对比 with open 的优点 1、自动关闭文件&#xff1a;with 语句会在代码块执行完毕后自动关闭文件&#xff0c;无需显式调用 close() 方法。 2、异常安全&#xff1a;如果在代码块中发生异常&#xff0c;with 语句仍然会确保文件被正确关闭。 3、…