问题
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
一、解决思路
回溯法
处理排列问题每次都要从头开始搜索,排列问题需要使用一个used数组来标记已经使用过的元素(在树枝上使用过),终止条件是当收集元素的数组path的长度和nums数组一样大时,说明找到了全排列
代码
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums, vector<bool>& used){
if (path.size()==nums.size()){
result.push_back(path);
return;
}
for (int i = 0; i<nums.size(); i++){
if (used[i]==true){
continue;
}
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
used[i] = false;
path.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
int index = 0;
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return result;
}
};
总结
排列问题与组合问题不同之处:
每层都是从0开始搜索,而不是从startIndex开始
需要used数组记录path存放的元素