全排列

题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

思路

和组合的区别就是需要不同排列中的元素是可以重复的,只要位置不一样就可以

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void permuteAux(vector<int> nums, int n) {
        for(int i = 0; i < nums.size(); ++i)
        {
            path.emplace_back(nums[i]);
            if(path.size() == n){
                res.emplace_back(path);
            }
            vector<int> num_next = nums;
            num_next.erase(num_next.begin() + i);
            permuteAux(num_next, n);
            path.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        permuteAux(nums, nums.size());
        return res;
    }
};

40min拿下

看了代码随想录,可以使用used数组,减少空间和时间复杂度

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (used[i] == true) continue; // path里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top