- 题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
- 解题思路:
本题是使用回溯算法来解决排列问题的标准题目(回溯算法适合解决组合和排列的问题),与组合问题不同的是,排列问题要注意顺序问题,因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1,所以每次递归的时候不需要从startindex,而是直接从0开始,使用一个used数组来保存已经使用了哪些数。 - 解题代码:
class Solution {
public:
vector> permute(vector& nums) {
vector> res;
vector current;
//使用一个used数组来对使用过的位置进行记录(注意vector的初始化方法)
vector used (nums.size(),false);
backracking(res,nums,current,used);
return res;
}
void backracking(vector> &res,vector nums,vector& current,vector& used){
if(current.size() == nums.size()){
res.push_back(current);
return;
}
//因为排列问题每次都要从头开始搜索,所以不能使用startindex
for(int i = 0;i < nums.size();i++){
if(used[i] == true){
continue;
}
used[i] = true;
current.push_back(nums[i]);
backracking(res,nums,current,used);
current.pop_back();
used[i] = false ;
}
}
};
- tips:
对c++中的vector进行批量的初始化:vector res ( 要初始化的长度 ,值 );