1. 程式人生 > 其它 >LeetCode/全排列

LeetCode/全排列

給定一個不含重複數字的陣列nums,返回其所有可能的全排列,你可以按任意順序返回答案

回溯法

思路:每次選一個,轉移到下一空間,考慮用回溯思想,遍歷可選數,遞迴每一位,當最後一位選取結束時記錄結果

粗糙寫法
class Solution {
public:
    vector<vector<int>> res;
    int len;
    unordered_set<int> sets;
    vector<vector<int>> permute(vector<int>& nums) {
        vector<int> num;
        len=nums.size();
        backtrack(nums,num,0);
        return res;
    }
    void backtrack(vector<int>& nums,vector<int>& num,int index){
        if(index==len){
            res.push_back(num);
            return;
        }
        for(int i=0;i<len;i++){
            if(sets.count(nums[i])>0) continue;
            num.push_back(nums[i]);
            sets.insert(nums[i]);
            backtrack(nums,num,index+1);
            num.pop_back();
            sets.erase(nums[i]);
        }
    }
};

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int> > res;
        backtrack(res, nums, 0, (int)nums.size());
        return res;
    }
    void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
        // 所有數都填完了
        if (first == len) {
            res.emplace_back(output);
            return;
        }
        for (int i = first; i < len; ++i) {
            // 動態維護陣列
            swap(output[i], output[first]);
            // 繼續遞迴填下一個數
            backtrack(res, output, first + 1, len);
            // 撤銷操作
            swap(output[i], output[first]);
        }
    }
};