LeetCode 46 Permutations

135 阅读1分钟

LeetCode 46 Permutations

思路

交换法

通过将元素两两交换形成新的排列。

记录元素是否已使用

使用map<int, bool>记录元素是否已使用过。

代码

交换法

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        if (nums.empty()) return {};
        
        vector<vector<int>> rs;
        
        addPermutation(rs, nums, 0);
        
        return rs;
    }
    
    void addPermutation(vector<vector<int>> &rs, vector<int> &nums, int cur) {
        if (cur == nums.size()) {
            rs.push_back(nums);
            return ;
        }
        
        for (int i = cur; i < nums.size(); ++i) {
            swap(nums[cur], nums[i]);
            addPermutation(rs, nums, cur + 1);
            swap(nums[cur], nums[i]);
        }
    }
    
};

记录元素是否使用过

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        if (nums.empty()) return {};
        
        vector<vector<int>> rs;
        vector<int> permutation;
        map<int, bool> alreadyIn;

        for (const auto &i : nums)
            alreadyIn[i] = false;
        addPermutation(rs, nums, permutation, alreadyIn);
        
        return rs;
    }
    
    void addPermutation(vector<vector<int>> &rs, vector<int> &nums, vector<int> &permutation, map<int, bool> &alreadyIn) {
        if (nums.size() == permutation.size()) {
            rs.push_back(permutation);
            return ;
        }
        
        for (int i = 0; i < nums.size(); ++i) {
            if (!alreadyIn[nums[i]]) {
                permutation.push_back(nums[i]);
                alreadyIn[nums[i]] = true;
                addPermutation(rs, nums, permutation, alreadyIn);
                alreadyIn[nums[i]] = false;
                permutation.pop_back();
            }
        }
    }
};