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;
}
};

京公网安备 11010502036488号