全排列
for循环生成节点时,若元素已经使用了,就跳过当前元素,选择后面的元素
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<bool> used;
void func(const vector<int>& nums){
if(path.size() == nums.size()){
ans.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++){
if(used[i]){
continue;
}
path.push_back(nums[i]);
used[i] = true;
func(nums);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
used.resize(nums.size(), false);
func(nums);
return ans;
}
};
class Solution {
public:
vector<vector<int>> ans;
void fun(int startIndex, vector<int>& nums){
if(startIndex == nums.size() - 1){
ans.push_back(nums);
return;
}
for(int i = startIndex; i < nums.size(); i++){
swap(nums[startIndex], nums[i]);
fun(startIndex + 1, nums);
swap(nums[startIndex], nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
fun(0, nums);
return ans;
}
};
全排列II
首先需要将nums排序,才能判断相邻的元素是否重复,来达到去重的目的
同一树层中,不使用相同的元素,这种情况下,nums[i] == nums[i-1] 但是 used[i-1] == false,前一个元素对应的used之所以为false,是因为我们从前向后选择元素时,前面的元素必然已经使用过了,只不过回溯后used为false
若nums[i] == nums[i-1] 但是 used[i-1] == true,表示同一树枝上使用了相同的元素,这是可以存在的
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<bool> used;
void func(const vector<int>& nums){
if(path.size() == nums.size()){
ans.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++){
if(used[i]){
continue;
}
if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false){
continue;
}
path.push_back(nums[i]);
used[i] = true;
func(nums);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
used.resize(nums.size(), false);
func(nums);
return ans;
}
};