回溯算法15:全排列
创始人
2025-05-30 10:48:17
0

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。
转载代码随想录
原文链接:
代码随想录
leetcode链接:46. 全排列

题目:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例:

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

思路:

此时我们已经学习了77.组合问题 、 131.分割回文串 和78.子集问题,接下来看一看排列问题。

相信这个排列问题就算是让你用for循环暴力把结果搜索出来,这个暴力也不是很好写。

所以正如我们在关于回溯算法,你该了解这些!所讲的为什么回溯法是暴力搜索,效率这么低,还要用它?

因为一些问题能暴力搜出来就已经很不错了!

我以[1,2,3]为例,抽象成树形结构如下:
在这里插入图片描述

回溯三部曲

递归函数参数

首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了

但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示:
在这里插入图片描述代码如下:

vector> result;
vector path;
void backtracking (vector& nums, vector& used)

递归终止条件

在这里插入图片描述可以看出叶子节点,就是收割结果的地方。

那么什么时候,算是到达叶子节点呢?

当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。

代码如下:

// 此时说明找到了一组
if (path.size() == nums.size()) {result.push_back(path);return;
}

单层搜索的逻辑

这里和77.组合问题、131.切割问题 和78.子集问题最大的不同就是for循环里不用startIndex了。

因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。

而used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。

代码如下:

for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;
}

整体C++代码如下:

class Solution {
public:vector> result;vector path;void backtracking (vector& nums, vector& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}vector> permute(vector& nums) {result.clear();path.clear();vector used(nums.size(), false);backtracking(nums, used);return result;}
};

总结

大家此时可以感受出排列问题的不同:

  • 每层都是从0开始搜索而不是startIndex
  • 需要used数组记录path里都放了哪些元素了

排列问题是回溯算法解决的经典题目,大家可以好好体会体会。

自己的代码

class Solution {
public:vector> permute(vector& nums) {vectortemp(nums);sort(temp.begin(),temp.end());vector>result;do{result.push_back(temp);}while(next_permutation(temp.begin(),temp.end()));return result;}
};
class Solution {vector>result;vectorpath;void dfs(vector& nums, vectorused) {if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); ++i) {if (used[i] == true) {      //已经被用过了,就不能再用了continue;}path.push_back(nums[i]);used[i] = true;dfs(nums, used);used[i] = false;path.pop_back();}return;}public:vector> permute(vector& nums) {vectorused(nums.size(), false);dfs(nums, used);return result;}
};

相关内容

热门资讯

《法学基本概念导论》| 专研法... 导言 本书是对权利、义务、法律主体、法律规范、法律渊源、法律行为等法学基本概念(juristic f...
上海AI新动向:世界AI合作组... 在今日的天气状况下,上海迎来了阴到多云的天气,偶尔还有阵雨光顾,气温徘徊在27至31摄氏度之间,给市...
山鹰国际跌1.52%,成交额2... 来源:新浪证券-红岸工作室 7月25日,山鹰国际跌1.52%,成交额2.50亿元,换手率2.33%,...
马斯克擎天柱解决不了无「手」难... 新智元报道 编辑:英智 【新智元导读】马斯克说人形机器人是特斯拉的未来,可今年5000台的目标才刚...
开封警方回应网传“释永信相关警... 7月27日,开封市公安局官方微博回复网友评论时表示:“(网传释永信相关)通报是假的,请不要再传播,目...
创新业务模式 提升开放水平 近日,在东营综合保税区食用油分装生产车间,工人们正在进行进口豆油灌装作业。 近年来,东营综合保税区...
中国资本市场学会成立!吴清当选... 来源:证监会发布 2025年7月26日,中国资本市场学会成立大会暨第一届第一次会员代表大会在上...
本周外盘看点丨美联储最新决议来... 来源:第一财经 欧美二季度GDP表现如何,特朗普关税谈判“大限”到来。 上周国际市场风云变幻,美国...
生态环境部逯世泽:全国碳市场量... 21世纪经济报道记者雷椰 李德尚玉 北京报道 7月26日,由冶金工业规划研究院主办,中国节能协会冶金...
原创 帮... 刚刚,后台好多朋友问,帮主啊,国家统计局刚发了上半年的工业利润数据,下降了1.8%,这是不是经济不行...
“国补”来了!第三批690亿元... 国家发展改革委下达今年第三批690亿元超长期特别国债支持消费品以旧换新资金。 2025年以来,国家发...
海拍客IPO,创始人抵押价值上... 瑞财经 严明会 6月30日,Yangtuo Technology Inc.(以下简称“海拍客”)向港...
提前涨停!快递巨头出手:收购! 【导读】布局品质快递,申通快递以3.62亿元收购菜鸟旗下丹鸟物流 中国基金报记者 杨晨 7月25日晚...
第八届虹桥国际经济论坛发布主题... 第八届虹桥国际经济论坛(简称“虹桥论坛”)倒计时迎来一百天。记者获悉,第八届虹桥论坛的主题是“开放共...
21独家|吴清挂帅!资本市场超... 21世纪经济报道 记者 崔文静 上海报道 7月26日,一场关乎2亿股民的重磅会议召开,资本市场“国家...
原创 A... 最近的行情,简直像是被注入了一针强心剂,让不少老股民都忍不住揉眼睛——这是咱们熟悉的大盘吗?原本在3...
关于比特币,你可能不知道的(二... 本文来自微信公众号:,作者:经济小张,原文标题:《关于比特币,你可能不知道的(2):让比特币独一无二...
【WAIC2025】阶跃星辰发... 记者 钱玉娟 在2025世界人工智能大会(下称“WAIC 2025”)开幕前夜,7月25日,中国人工...
每周股票复盘:浙数文化(600... 截至2025年7月25日收盘,浙数文化(600633)报收于14.05元,较上周的14.01元上涨0...