LeetCode算法系列:46. Permutations && 47. Permutations II

这两个问题关联性很强就放到一起了

题目描述

46,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]
]

47,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]
]

算法实现:

采用递归的方式,将传入的数组在当前位置和其后的所有元素依次交换位置,交换后再依次递归后面的位置。对47题中可能出现的重复元素则不再交换

//46
class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        if(nums.empty()) return res;
        RE(nums, res, 0);
        return res;
    }
    void RE(vector<int>& nums,vector<vector<int>> &res,int s){
        if(s == nums.size()){
            res.push_back(nums);
            return;
        }
        for(int i = s; i < nums.size(); i ++){
            swap(nums[i], nums[s]);
            RE(nums, res, s + 1);
            swap(nums[i], nums[s]);            
        }
        return;
    }
};
//47
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> res;
        if(nums.empty()) return res;
        RE(nums, res, 0);
        return res;
    }
    void RE(vector<int>& nums,vector<vector<int>> &res,int s){
        if(s == nums.size()){
            res.push_back(nums);
            return;
        }
        for(int i = s; i < nums.size(); i ++){
            
            bool flag = false;
            //之前交换过的元素中如果出现重复的就无须再次交换
            for(int j = s; j < i; j ++)
                if(nums[i] == nums[j])
                {
                    flag = true;
                    continue;
                }
            if(flag)continue;
            swap(nums[i], nums[s]);
            RE(nums, res, s + 1);
            swap(nums[i], nums[s]);            
        }
        return;
    }
};

 


版权声明:本文为wyf826459原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。