📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
全排列
题目链接
题目描述
给定一个不含重复数字的数组
nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
解题思路
典型的回溯题⽬,我们需要在每⼀个位置上考虑所有的可能情况并且不能出现重复。通过深度优先搜
索的⽅式,不断地枚举每个数在当前位置的可能性,并回溯到上⼀个状态,直到枚举完所有可能性,
得到正确的结果。
每个数是否可以放⼊当前位置,只需要判断这个数在之前是否出现即可。具体地,在这道题⽬中,我
们可以通过⼀个递归函数backtrack和标记数组visited来实现全排列。
递归函数的设计
void dfs(vector<int>& nums)
:只有一个参数用来存放输入的数组;
递归流程如下:
- ⾸先定义⼀个⼆维数组
ret
⽤来存放所有可能的排列,⼀个⼀维数组ret
⽤来存放每个状态的排
列,⼀个⼀维数组check
标记元素,然后从第⼀个位置开始进⾏递归;- 在每个递归的状态中,我们维护⼀个路径
path
,表⽰当前已经处理的路径;- 递归结束条件:当
path.size()
等于nums
数组的⻓度时,说明我们已经处理完了所有数字,将当前数组
存⼊结果中;- 在每个递归状态中,枚举所有下标i,若这个下标未被标记,则使⽤
nums
数组中当前下标的元
素:
a.将check[i]
标记为1;
b.将nums[i]
push到path
的尾部;
c.对当前路径的下一位置进⾏递归;dfs(nums);
d.将check[i]
标记为0,表示回溯;
代码
class Solution { vector<vector<int>> ret; vector<int> path; bool check[7]; public: vector<vector<int>> permute(vector<int>& nums) { dfs(nums); return ret; } { if(nums.size() == path.size()) { ret.push_back(path); return; } for(int i = 0; i < nums.size(); ++i) { if(check[i] == false) { path.push_back(nums[i]); check[i] = true; dfs(nums); path.pop_back(); check[i] = false; } } } }