题目意思很好理解,给定数组的全排列,对于此种类型的题目,应该首先想到回溯,可以很轻松的解决该问题。下面给出两种回溯算法的题解。
方法一:
用一个bool型数组记录该数是否用过,当然为了避免数组中有重复数,我们记录的是数组的下标。然后用一个二维数组储存答案,一个一维数组储存每一次回溯时的结果,后面的步骤就是典型的回溯套路,进栈,回溯出栈,然后可以得到最后的结果。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
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);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(),false);
backtracking(nums,used);
return result;
}
};
方法二:
由于最后所求数组都是nums的全排列,所以我们可以直接将nums中的数每一个之间进行交换,然后回溯得到最后的结果。
class Solution {
public:
void backtracking(vector<vector<int>>& result,vector<int>& nums,int index){
if(index == nums.size()){
result.push_back(nums);
return;
}
for(int i = index;i < nums.size();i++){
swap(nums[i],nums[index]);
backtracking(result,nums,index + 1);
swap(nums[i],nums[index]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
backtracking(result,nums,0);
return result;
}
};