版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen134225/article/details/82218869
题目1:
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
代码1:
class Solution {
public:
void permuteHelp(vector<int> &nums, vector<vector<int> > &res, int k, int len)
{
if(k == len)
{
res.push_back(nums);
return;
}
for(int i = k; i < len; ++i)
{
swap(nums[i], nums[k]);
permuteHelp(nums, res, k + 1, len);//如果将k+1改成i+1,答案不对
swap(nums[i], nums[k]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
if(len == 0)
return res;
permuteHelp(nums, res, 0, len);
return res;
}
};
代码2:
class Solution {
public:
void permuteHelp(vector<int> nums, vector<vector<int> > &res, int k, int len)
{
if(k == len)
{
res.push_back(nums);
return;
}
for(int i = k; i < len; ++i)
{
swap(nums[i], nums[k]);
permuteHelp(nums, res, k + 1, len);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
if(len == 0)
return res;
permuteHelp(nums, res, 0, len);
return res;
}
};
上面两个代码答案都正确,nums加引用和不加引用都正确。
题目2:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
正确代码:
class Solution {
public:
void permuteUniqueHelp(vector<int> nums, vector<vector<int> > &res, int k, int len)
{
if(k == len-1)
{
res.push_back(nums);
return;
}
for(int i = k; i < len; ++i)
{
if(i != k && nums[i] == nums[k])
continue;
swap(nums[i], nums[k]);
permuteUniqueHelp(nums, res, k + 1, len);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
if(len == 0)
return res;
sort(nums.begin(), nums.end());
permuteUniqueHelp(nums, res, 0, len);
return res;
}
};
错误代码:
class Solution {
public:
void permuteUniqueHelp(vector<int> &nums, vector<vector<int> > &res, int k, int len)
{
if(k == len-1)
{
res.push_back(nums);
return;
}
for(int i = k; i < len; ++i)
{
if(i != k && nums[i] == nums[k])
continue;
swap(nums[i], nums[k]);
//cout << "before" << nums[i] <<";" <<nums[k] << endl;
permuteUniqueHelp(nums, res, k + 1, len);
//cout <<"after" << nums[i] << ";" << nums[k] << endl;
/*和上一个代码的区别:nums加引用,下面加一行代码*/
swap(nums[i], nums[k]);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
if(len == 0)
return res;
sort(nums.begin(), nums.end());
permuteUniqueHelp(nums, res, 0, len);
return res;
}
};
这题的两种代码和第一题的两种代码是对应,在这种情况下nums加引用就不对了。而调试时,after和before栈顶元素一一对应的,目前不清楚这种方法为啥不对!