Given a collection of distinct integers, return all possible permutations.
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
回溯法
简介:回溯法就是树形问题上的DFS(深度优先遍历),内含有回溯的操作。
状态: 求解问题的不同阶段,例如图中[2,1]
表示 我们已经确定了一个排列的第一个元素是2
,第二个元素是1
。在这个阶段下,我们或者是继续搜索第三个元素的值,也可以是第三个元素的值已经考虑完了,回到上一层结点。
**状态重置(回溯):**由于深度优先搜索(DFS)有回头的过程,在回头以后,状态变量就得重置成和刚刚来到这个结点的时候一样。
我们通过撤销上一次的选择,来实现状态重置。
C++
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size() == 0) return res;
vector<int> path;
vector<bool> used(10000,0);//记录已经使用过的数,避免排列内出现重复的数字
backtrack(res ,path, used, nums, 0);
return res;
}
void backtrack(vector<vector<int>>& res, vector<int> path, vector<bool> used, vector<int> nums, int depth){
if(depth == nums.size()){
res.push_back(path);
return;
}
for(int i = 0; i < nums.size() ; i++){
if(used[i]){
continue;
}
path.push_back(nums[i]);
used[i] = true;
backtrack(res, path, used, nums, depth + 1);
//回溯,撤销之前的操作,返回上一结点
path.pop_back();
used[i] = false;
}
}
};
参考: 全排列