题目
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
思路
和组合的区别就是需要不同排列中的元素是可以重复的,只要位置不一样就可以
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void permuteAux(vector<int> nums, int n) {
for(int i = 0; i < nums.size(); ++i)
{
path.emplace_back(nums[i]);
if(path.size() == n){
res.emplace_back(path);
}
vector<int> num_next = nums;
num_next.erase(num_next.begin() + i);
permuteAux(num_next, n);
path.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
permuteAux(nums, nums.size());
return res;
}
};
40min拿下
看了代码随想录,可以使用used数组,减少空间和时间复杂度
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; // path里已经收录的元素,直接跳过
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return result;
}
};