思路
交换法
通过将元素两两交换形成新的排列。
记录元素是否已使用
使用map<int, bool>记录元素是否已使用过。
代码
交换法
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
if (nums.empty()) return {};
vector<vector<int>> rs;
addPermutation(rs, nums, 0);
return rs;
}
void addPermutation(vector<vector<int>> &rs, vector<int> &nums, int cur) {
if (cur == nums.size()) {
rs.push_back(nums);
return ;
}
for (int i = cur; i < nums.size(); ++i) {
swap(nums[cur], nums[i]);
addPermutation(rs, nums, cur + 1);
swap(nums[cur], nums[i]);
}
}
};
记录元素是否使用过
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
if (nums.empty()) return {};
vector<vector<int>> rs;
vector<int> permutation;
map<int, bool> alreadyIn;
for (const auto &i : nums)
alreadyIn[i] = false;
addPermutation(rs, nums, permutation, alreadyIn);
return rs;
}
void addPermutation(vector<vector<int>> &rs, vector<int> &nums, vector<int> &permutation, map<int, bool> &alreadyIn) {
if (nums.size() == permutation.size()) {
rs.push_back(permutation);
return ;
}
for (int i = 0; i < nums.size(); ++i) {
if (!alreadyIn[nums[i]]) {
permutation.push_back(nums[i]);
alreadyIn[nums[i]] = true;
addPermutation(rs, nums, permutation, alreadyIn);
alreadyIn[nums[i]] = false;
permutation.pop_back();
}
}
}
};