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