作者主页:慢热的陕西人
专栏链接:力扣刷题日记
欢迎各位大佬点赞关注收藏,留言
46. 全排列 - 力扣(LeetCode)
给定一个不含重复数字的数组
nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
典型的回溯题⽬,我们需要在每⼀个位置上考虑所有的可能情况并且不能出现重复。通过深度优先搜
索的⽅式,不断地枚举每个数在当前位置的可能性,并回溯到上⼀个状态,直到枚举完所有可能性,
得到正确的结果。每个数是否可以放⼊当前位置,只需要判断这个数在之前是否出现即可。具体地,在这道题⽬中,我
们可以通过⼀个递归函数backtrack和标记数组visited来实现全排列。递归函数的设计
void dfs(vector
:& 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;
}
}
}
}