力扣46:全排列
题目
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
思路
看到所有可能首先想到的就是回溯。
回溯的结束条件也很好写,用数组的长度来判断即可。这道题的难点主要是如何进行判断这个位置我们已经使用过了,和我们之前的回溯不同之前的回溯可能每个位置是一个字符串或者数组所以我们可以使用下标来控制,这道题我们每个位置都只是一个数字所以我们得另想办法。其实也很简单我们用一个存储着bool类型的数组不就可以了如果这个位置已经插入了我们就把对应下标设为true如果没插入就是flase。思路有了代码就很简单了。
代码
cpp
class Solution {
public:
void BackCall(vector<vector<int>>& res,vector<int>& nums,vector<bool>& v,vector<int> tmp)
{
if(tmp.size() == nums.size())
{
res.push_back(tmp);
return;
}
for(int i = 0; i <nums.size();i++)
{
if(v[i] == true)
{
continue;
}
v[i] = true;
tmp.push_back(nums[i]);
BackCall(res,nums,v,tmp);
tmp.pop_back();
v[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> tmp;
//使用索引和bool类型来判断此位置是否已经使用过了
vector<bool> v(nums.size(),false);
//回溯
BackCall(res,nums,v,tmp);
return res;
}
};