permute I and II

版权声明:本文为博主原创文章,未经博主允许不得转载。 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栈顶元素一一对应的,目前不清楚这种方法为啥不对!

猜你喜欢

转载自blog.csdn.net/chen134225/article/details/82218869