LeetCode/全排列
阿新 • • 發佈:2022-05-13
給定一個不含重複數字的陣列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]); } } };