Permutations
If we change the argument vector<int>nums
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
if(nums.empty()) return res;
sort(nums.begin(), nums.end());
DFS(res, nums, 0);
return res;
}
void DFS(vector<vector<int>>& res, vector<int> nums, int start){
if(start == nums.size() - 1){
res.push_back(nums);
return;
}
for(int i = start; i < nums.size(); i++){
swap(nums[i], nums[start]);
DFS(res, nums, start + 1);
}
}
};
If we change the argument vector<int>nums into reference, we would need another swap:
swap(nums[i], nums[start]);
DFS(res, nums, start + 1);
swap(nums[i], nums[start]);
Permutations II
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
if(nums.empty()) return res;
sort(nums.begin(), nums.end());
DFS(res, nums, 0);
return res;
}
void DFS(vector<vector<int>>& res, vector<int> nums, int start){
if(start == nums.size() - 1){
res.push_back(nums);
return;
}
for(int i = start; i < nums.size(); i++){
if(i != start && nums[i] == nums[start])
continue;
swap(nums[i], nums[start]);
DFS(res, nums, start + 1);
}
}
};
If we change the argument vector<int>nums into reference, we would need a few lines of modifications:
void helper(vector<vector<int>>& res, vector<int>& nums, int pos) {
if (pos == nums.size()) {
res.push_back(nums);
} else {
for (int i = pos; i < nums.size(); ++i) {
if (i > pos && nums[i] == nums[pos]) continue;
swap(nums[pos], nums[i]);
helper(res, nums, pos + 1);
}
// restore nums
for (int i = nums.size() - 1; i > pos; --i) {
swap(nums[pos], nums[i]);
}
}
}

本文深入探讨了两种排列算法:一种用于生成所有可能的排列,另一种用于生成唯一排列,避免重复。通过递归深度优先搜索(DFS)实现,文章详细介绍了算法的具体实现过程,并展示了如何处理重复元素。
708

被折叠的 条评论
为什么被折叠?



