0
点赞
收藏
分享

微信扫一扫

LeetCode 全排列


LeetCode 全排列_sed

LeetCode 全排列_leetcode_02


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;
}
};

LeetCode 全排列_算法_03

LeetCode 全排列_sed_04


首先需要将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;
}
};


举报

相关推荐

0 条评论