组合问题
全排列
-
全排列Ⅰ
-
数组内不含重复数字
-
// 回溯 class Solution { vector<vector<int>> ans; public: void backtracking(vector<int>& nums,int label) { // 确定终止条件 if(label == nums.size()) { ans.push_back(nums); return; } for(int i=label;i<nums.size();i++) { swap(nums[label],nums[i]); backtracking(nums,label+1); // 回溯时是label+1而不是i+1,i+1会丢失一些排列组合 swap(nums[label],nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { backtracking(nums,0); return ans; } };
-
-
全排列Ⅱ
-
数组内含有重复数字
-
class Solution { public: void backtracking(vector<vector<int>>& ans,int level,set<vector<int>> & pre_ans,vector<int>& nums) { if(level == nums.size()) { if(!pre_ans.count(nums)) { pre_ans.insert(nums); ans.push_back(nums); } return; } for(int i=level;i<nums.size();i++) { swap(nums[level],nums[i]); backtracking(ans,level+1,pre_ans,nums); swap(nums[level],nums[i]); } } vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>> ans; set<vector<int>> pre_ans; // unordered_set内元素的类型不能是vector,但是set可以 backtracking(ans,0,pre_ans,nums); return ans; } };
-