46. Permutations
class Solution {
public:
void DFS(int k, int& n, int* vis, vector<int>& nums, vector<int>& chs, vector<vector<int>>& result){
if(n == k){
result.push_back(chs);
return;
}
for(int i = 0; i < n; i++){
if(vis[i]) continue;
vis[i] = 1; chs.push_back(nums[i]);
DFS(k+1, n, vis, nums, chs, result);
vis[i] = 0; chs.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
int vis[n] = {0};
vector<int> chs;
vector<vector<int>> result;
DFS(0, n, vis, nums, chs, result);
return result;
}
};
47. Permutations II
和Combination Sum II是类似的,只用递归重复数字的第一个数字,后面都是重复的解。
class Solution {
public:
void DFS(int k, int& n, int* vis, vector<int>& nums, vector<int>& chs, vector<vector<int>>& result){
if(n == k){
result.push_back(chs);
return;
}
for(int i = 0; i < n; i++){
if(vis[i]) continue;
if(i && nums[i] == nums[i-1] && !vis[i-1]) continue;
vis[i] = 1; chs.push_back(nums[i]);
DFS(k+1, n, vis, nums, chs, result);
vis[i] = 0; chs.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
int vis[n] = {0};
vector<int> chs;
vector<vector<int>> result;
sort(nums.begin(), nums.end());
DFS(0, n, vis, nums, chs, result);
return result;
}
};