1、 组合
组合问题和子集问题类似,只不过判断条件不同而已。组合需要到达树的底部才添加到数组里。
题目:输入两个数字 n, k,算法输出 [1..n] 中 k 个数字的所有组合。
比如输入 n = 4, k = 2,输出如下结果,顺序无所谓,但是不能包含重复(按照组合的定义,[1,2] 和 [2,1] 也算重复)
vector<vector<int>>res; vector<vector<int>> combine(int n, int k) { if (k <= 0 || n <= 0) return res; vector<int> track; backtrack(n, k, 1, track); return res; } void backtrack(int n, int k, int start, vector<int>& track) { // 到达树的底部 if (k == track.size()) { res.push_back(track); return; } // 注意 i 从 start 开始递增 for (int i = start; i <= n; i++) { // 做选择 track.push_back(i); backtrack(n, k, i + 1, track); // 撤销选择 track.pop_back(); } }
2、 排序
需要去重操作,还得好好看看。目前没理解透彻
class Solution { public: vector<string>res; vector<string> permutation(string s) { int cursor=0; permutation(s,cursor); return res; } void permutation(string &s,int cursor){ if(cursor==s.size()-1){ res.push_back(s); } else{ for(int i=cursor;i<s.size();i++){ if(judge(s,cursor,i))continue; //从cursor开始,遍历不重复的字符 swap(s[cursor],s[i]); permutation(s,cursor+1); swap(s[cursor],s[i]); } } } bool judge(string& s, int start, int end) { for (int i = start; i < end; ++i) { if (s[i] == s[end]) return true; } return false; } };