46. 全排列 47. 全排列 II

46. 全排列 

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

 解法:

class Solution {
public:
    void trace(vector<vector<int>>& res, vector<int>& nums, int index, int len) {
        if (index == len) {
            res.push_back(nums);
            return;
        }

        for (int i = index; i < len; ++i) {
            swap(nums[i], nums[index]);
            trace(res, nums, index + 1, len);
            swap(nums[index], nums[i]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        int len = nums.size();
        if (len == 0)
            return res;

        trace(res, nums, 0, len);

        return res;
    }
};

 47. 全排列  ||

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

解法:

class Solution {
public:
    void trace(vector<vector<int>>& res, vector<int>& nums, int index, int len) {
        if (index == len) {
            res.push_back(nums);
            return;
        }

        unordered_map<int, bool> hash;                   //记录已换位数去重
        for (int i = index; i < len; ++i) {
            if (hash[nums[i]])
                continue;
            swap(nums[i], nums[index]);
            trace(res, nums, index + 1, len);
            swap(nums[index], nums[i]);
            hash[nums[i]] = true;
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> res;
        int len = nums.size();
        if (len == 0)
            return res;

        trace(res, nums, 0, len);

        return res;
    }
};

31. 下一个排列

猜你喜欢

转载自blog.csdn.net/sy_123a/article/details/108409430