回溯(组合、排列)
回溯法和深度优先搜索很像,不同的是回溯算法一旦发现选择的路径不符合目标,就会退一步,重新选择不同的路继续搜索。而深度优先搜索则是“不撞南墙不回头”,走完一条路再回退到上一个结点走另一条路。
剪枝一般都要把候选先排序。
DFS和回溯区别:回溯会“回头”。
题型总结
题目集合
LeetCode 17 电话号码的字母组合
LeetCode 22 括号生成
LeetCode 46 全排列
LeetCode 39 组合总和 元素可以重复选择,候选中没有相同元素,并且是组合问题
Leetcode 40 组合总和2 一个元素不能重复选择,候选中有相同元素,并且是组合问题(用begin)
40与39的区别:1.要过滤掉重复组合,先把候选元素排序,然后做判断是不是和上一个元素相等
2.不能重复选择,所以在for中调用dfs不能还在同一点上begin。
LeetCode 78 子集
树的中序遍历
vector<int> inorderTraversal(TreeNode* root) {
//用栈实现
stack<TreeNode*> s;
vector<int> ans;
while(!s.empty() || root){ //注意循环条件
while(root){
s.push(root);
root=root->left;
}
root=s.top(); //注意给root重新赋值
s.pop();
ans.push_back(root->val);
root=root->right; //注意此处不用判断是否有右孩子,若无右孩子,root=NULL,则下一次循环时会继续出栈。
}
return ans;
}