1. 程式人生 > 其它 >【LeetCode】46.全排列

【LeetCode】46.全排列

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

示例 1:

輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

演算法(DFS)

時間複雜度:\(O(n!)\)

回溯演算法的框架

result = []
def backtrack(路徑, 選擇列表):
    if 滿足結束條件:
        result.add(路徑)
        return

    for 選擇 in 選擇列表:
        做選擇
        backtrack(路徑, 選擇列表)
        撤銷選擇

解決回溯問題時考慮三個問題即可:

  1. 路徑:也就是已經做出的選擇
  2. 選擇列表:也就是你當前可以做的選擇
  3. 結束條件:也就是到達決策樹底層,無法再做選擇的條件
class Solution {
public:
    vector<vector<int>> res; //記錄返回結果

    vector<vector<int>> permute(vector<int>& nums) {
        vector<int> track; //記錄路徑
        backtrack(track, nums);
        return res;
    }

    void backtrack(vector<int>& track, vector<int>& nums) {
        //觸發結束條件
        if (track.size() == nums.size())
            res.push_back(track);
        
        for (auto num : nums) {
            //排除不合法的選擇
            if (find(track.begin(), track.end(), num) != track.end())
                continue;
            
            track.push_back(num);
            backtrack(track, nums);
            track.pop_back();
        }
    }
};