给定一个没有重复数字的序列,返回其所有可能的全排列,示例如下:
1.抽象成树形结构
回溯三部曲:
(1)参数及返回值:排列是有序的,这是不同于集合和子集的情况,所以处理问题不再需要start,而是需要一个used数组,标记已经选择的元素,返回类型为void。
(2)确定终止条件:当单个结果数组的长度与给定数组的长度相等时,说明到达了叶子节点,可以保存结果并返回。
(3)单层递归的逻辑:排列问题每次都要从头开始搜索。
实现代码如下:
//全排列
vector<int> vec;
vector<vector<int>> result;
void backtracking(vector<int>& nums, vector<bool>& used) {
//终止条件
if(vec.size() == nums.size()) {
result.push_back(vec);
return;
}
//单层搜索逻辑
for(int i = 0; i<nums.size(); i++) {
if(used[i] == true) continue;
used[i] = true;
vec.push_back(nums[i]);
backtracking(nums,used); //递归
used[i] = false;
vec.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
vec.clear();
vector<bool> used(nums.size(), false);
backtracking(nums,used);
return result;
}