【LeetCode】46.全排列
阿新 • • 發佈:2021-08-16
給定一個不含重複數字的陣列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(路徑, 選擇列表) 撤銷選擇
解決回溯問題時考慮三個問題即可:
路徑
:也就是已經做出的選擇。選擇列表
:也就是你當前可以做的選擇。結束條件
:也就是到達決策樹底層,無法再做選擇的條件。
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(); } } };