交换法
class Solution {
private:
vector<vector<int>> res;
void backtrack(vector<int>& nums, int start, int end){
if(start >= end){
res.push_back(nums);
return;
}
for(int i = start; i < nums.size(); i++){
swap(nums[start], nums[i]);
backtrack(nums, start+1, end);
swap(nums[start], nums[i]);
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
backtrack(nums, 0, nums.size()-1);
return res;
}
};
bool 数组
class Solution {
private:
int n;
vector<vector<int>> res;
void backtrack(vector<int>& nums, vector<bool>& record, vector<int>& track){
if(track.size() == n){
res.push_back(track);
return;
}
for(int i = 0; i < n; i++){
if(record[i]){
track.push_back(nums[i]);
record[i] = false;
backtrack(nums, record, track);
record[i] = true;
track.pop_back();
}
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
n = nums.size();
vector<int> track;
vector<bool> record(n, true);
backtrack(nums, record, track);
return res;
}
};
class Solution {
private:
int n;
vector<vector<int>> res;
void backtrack(vector<int>& nums, vector<bool>& record, vector<int>& track){
if(track.size() == n){
res.push_back(track);
return;
}
for(int i = 0; i < n; i++){
if(i > 0 && nums[i] == nums[i-1] && record[i-1]) continue; // 去重
if(record[i]){
track.push_back(nums[i]);
record[i] = false;
backtrack(nums, record, track);
record[i] = true;
track.pop_back();
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
n = nums.size();
vector<int> track;
vector<bool> record(n, true);
sort(nums.begin(), nums.end());
backtrack(nums, record, track);
return res;
}
};
class Solution {
private:
vector<int> track;
vector<vector<int>> res;
void backtrack(vector<int>& track, int index, int n, int k){
if(track.size() == k){
res.push_back(track);
return;
}
for(int i = index; i <= n; i++){
track.push_back(i);
backtrack(track, i+1, n, k);
track.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtrack(track, 1, n, k);
return res;
}
};