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

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.mzph.cn/bicheng/1112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欢迎 Llama 3:Meta 的新一代开源大语言模型

介绍 Meta 公司的 Llama 3 是开放获取的 Llama 系列的最新版本&#xff0c;现已在 Hugging Face 平台发布。看到 Meta 持续致力于开放 AI 领域的发展令人振奋&#xff0c;我们也非常高兴地全力支持此次发布&#xff0c;并实现了与 Hugging Face 生态系统的深度集成。 Llama 3 提…

包装类的认识

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

Linux CPU火焰图

Linux CPU火焰图 1、火焰图简介 火焰图&#xff08;Flame Graph&#xff09;是一种强大的性的性能分析工具&#xff0c;专门用于可视化cpu时间消耗咋各个函数栈上的情况&#xff0c;可以很快帮助开发这识别程序中的性能瓶颈和热点函数&#xff0c;从而有效的进行程序优化&…

网络编程 -- 简易TCP网络程序

一 字符串回响 1.1 核心功能 字符串回响程序类似于 echo 指令&#xff0c;客户端向服务器发送消息&#xff0c;服务器在收到消息后会将消息发送给客户端&#xff0c;该程序实现起来比较简单&#xff0c;同时能很好的体现 socket 套接字编程的流程。 1.2 程序结构 这个程序我们…

基于Zookeeper 简单实现分布式任务协调组件

优质博文&#xff1a;IT-BLOG-CN 一、什么是 Zookeeper ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。 它是一个为分布式应用提供一致性服务的软件&#xff0c;提…

【管理】杨三角模型

企业成功 成功 战略 X 组织能力 1&#xff09;组织能力对于企业的重要性是和战略一样的&#xff1b; 2&#xff09;组织能力必须与战略适配&#xff0c;才能共同造就企业的成功。 员工思维&#xff1a;员工愿不愿意参与战略落地的实践&#xff1f;员工每天所关心、追求和重视的…

【C++】哈希封装map与set

目录 前言&#xff1a; 一&#xff0c;底层哈希结构 1-1&#xff0c;迭代器的封装 1-2&#xff0c;哈希表的封装 二&#xff0c;unordered_map的封装 三&#xff0c;unordered_set的封装 前言&#xff1a; 上一篇文章说明了哈希结构&#xff0c;这一篇文章来说明如何使用…

安装WSL2

PS C:\Users\pc> wsl --set-default-version 2 有关与 WSL 2 关键区别的信息&#xff0c;请访问 https://aka.ms/wsl2操作成功完成。PS C:\Users\pc> wsl --update 正在检查更新。 已安装最新版本的适用于 Linux 的 Windows 子系统。PS C:\Users\pc> wsl --shutdownPS…

PyTorch深度解析:Tensor——神经网络的核心构建块

在深度学习和神经网络的研究与应用中&#xff0c;Tensor&#xff08;张量&#xff09;无疑是一个核心概念。特别是在PyTorch这一强大的深度学习框架中&#xff0c;Tensor更是扮演了举足轻重的角色。本文将深入探讨PyTorch中的Tensor&#xff0c;从其基本定义、特性、操作到实际…

回溯算法练习day.3

39.组合总和 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返…

uniapp Android 插件开发教程

一、下载uniapp提供的SDK Android 离线SDK - 正式版 | uni小程序SDK 二、在uniapp创建一个项目 查看包名&#xff1a;发行--> 原生app 云打包 三、进入dcloud官网 开发者中心 进入 应用管理 --> 我的应用 --> 点击应用名称-->各平台信息-->新增 这里需要这…

每日三个JAVA经典面试题(四十三)

1.如何在大数据环境下优化Java性能&#xff1f; 在大数据环境下优化Java性能涉及多个方面&#xff0c;包括调整JVM设置、代码优化和选择合适的工具和框架。以下是一些具体的优化建议&#xff1a; 调整JVM参数&#xff1a; 增加堆内存&#xff1a;通过调整-Xms&#xff08;堆起…

SQLite FTS3 和 FTS4 扩展(三十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS5 扩展&#xff08;三十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 概述 FTS3 和 FTS4 是 SQLite 虚拟表模块&#xff0c;允许用户执行 对一组文档进行全文搜索。最常见&#xff08;和最…

paddle.net怎么付款?paddle.net怎么订阅?

有需要的小伙伴可以使用Fomepay的卡进行订阅支付&#xff0c;我这里使用的是491090卡段&#xff0c;开卡步骤很简单&#xff0c;点击获取卡片 1、注册 2、填写姓名使用拼音或者英文名都可以 3、支付宝或者微信支付

【22.1】【22.2】【22.3】

【题解/标程】2022牛客寒假算法基础集训营 1 题解标程 【题解】2022牛客寒假算法基础集训营2 【题解】2022牛客寒假算法基础集训营3 九小时九个人九扇门 思路&#xff1a;数字根。知道后 f ( x y ) f ( f ( x ) f ( y ) ) f(xy)f(f(x)f(y)) f(xy)f(f(x)f(y)) &#xff…

● State Schema Evolution的平滑迁移策略

State Schema Evolution指的是在分布式系统或数据库中&#xff0c;随着业务需求的发展和变化&#xff0c;需要对存储的状态&#xff08;如数据库表结构、数据模型等&#xff09;进行升级或调整的过程。平滑迁移策略的目标是在不影响系统正常运行、尽量减少服务中断时间的前提下…

基于51单片机的数字万用表设计

基于51单片机的数字万用表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.能够切换测量电压、电流、电阻&#xff1b; 2.数码管实时显示测量值&#xff1b; 3.短路报警&#xff1b; 4.测量…

Vue.extend()和我的两米大砍刀

Vue.extends是什么&#xff1f; 一个全局API,用于注册并挂载组件。 传统的引用组件的方式是使用import直接引入&#xff0c;但是使用Vue.extends()也可以实现。 使用规则 <div id"mount-point"></div>// 创建构造器 var Profile Vue.extend({templat…

Spring 声明式事务控制

1. 编程式事务控制相关对象 1.1 PlatformTransactionManager PlatformTransactionManager 接口是 spring 的事务管理器&#xff0c;它提供了我们常用的操作事务的方法。 PlatformTransactionManager 是接口类型&#xff0c;不同的 Dao 层技术则有不同的实现类。例如:Dao层技…