主要的方法
- 深度优先搜索,回溯算法
- 宽度优先搜索
- 是否有相同元素需要考虑等问题
针对所给问题,确定问题的解空间:
int a[n];
try(int i)
{
if(i>n)
输出结果;
else
{
for(j = 下界; j <= 上界; j=j+1)
// 枚举i所有可能的路径
{
if(fun(j)) // 满足限界函数和约束条件
{
a[i] = j;
// 其他操作
try(i+1);
回溯前的清理工作(如a[i]置空值等);
}
}
}
}
题目一
子集合,subset 不包括相同元素的情况
- 深度递归优先搜索算法
// Recursion
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > res;
vector<int> out;
sort(S.begin(), S.end());
getSubsets(S, 0, out, res);
return res;
}
void getSubsets(vector<int> &S, int pos, vector<int> &out, vector<vector<int> > &res) {
res.push_back(out);
// pos 是下界, size 是上界, 这也是
for (int i = pos; i < S.size(); ++i) {
out.push_back(S[i]);