46. Permutations
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
class Solution {
public:
void permute_recursive(vector<int> nums, vector<vector<int>>& result, int begin){ //特别需要注意此处nums是否采用引用传递
if(begin >= nums.size())
result.push_back(nums);
for(int i = begin; i < nums.size(); i++){
swap(nums[i],nums[begin]);
permute_recursive(nums,result,begin+1); //这里是begin不是i
// swap(nums[i],nums[begin]); //如果使用引用传递nums,此处需要swap回来;非引用传递时可有可无
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
if(nums.empty()) return result;
permute_recursive(nums,result,0);
return result;
}
};
47. Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].
class Solution {
public:
void permute_recursive(vector<vector<int>>& result, vector<int> nums,int begin) {
if(begin >=nums.size())
result.push_back(nums);
for(int i = begin;i < nums.size();i++){
if(i!=begin && nums[i] == nums[begin]) continue;
swap(nums[i],nums[begin]);
permute_recursive(result,nums,begin+1);
//swap(nums[i],nums[begin]);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
if(nums.empty()) return result;
sort(nums.begin(), nums.end()); //先排序
permutation(result,nums,0);
return result;
}
};
这两题很像,需要注意的是nums数组是否采用引用传递,对于第一种没有重复值的情况是可以采用引用传递的,但是第二种有重复值的情况就不行了,因为引用传递是直接改变nums的值的,经过permute_recursive之后,nums就改变了,后面再用swap也没用了。
本题还可以使用31. Next Permutation类似的方法来解。
bool nextPermutation(vector<int>& nums) {
int k = -1;
for (int i = nums.size() - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
k = i;
break;
}
}
if (k == -1) {
sort(nums.begin(), nums.end());
return false;
}
int l = -1;
for (int i = nums.size() - 1; i > k; i--) {
if (nums[i] > nums[k]) {
l = i;
break;
}
}
swap(nums[k], nums[l]);
reverse(nums.begin() + k + 1, nums.end());
return true;
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > res;
sort(nums.begin(), nums.end());
res.push_back(nums);
while (nextPermutation(nums))
res.push_back(nums);
return res;
}
或者直接用库函数
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
if(nums.empty()) return result;
vector<int> next_permute(nums);
while(1){
result.push_back(next_permute);
next_permutation(next_permute.begin(), next_permute.end());
if(next_permute == nums)
break;
}
return result;
}
};