搜索
1. 关于搜索
在leetcode上,搜索一般只会涉及BFS和DFS,所以本文仅仅关注这俩个。并给出一些我对搜索的理解,代码都是类似c++的伪代码。
1.1 BFS和DFS小谈
这里给出俩中搜索的模板,如果是第一次接触的话,这里仅仅对俩个模板有印象就可以了。后面会遇到具体的题,再回来看这里的模板。就非常有意思了。
1.1.1 BFS模板
void bfs()
queue.push(start)
while(queue.size())
step++
for i : queue.size()
curr = queue.pop()
for eachChild : findChilds(curr)
if !isVisited(eachChild)
queue.push(eachChild)
简单注释下:
bfs的要点就是记录每次横向的长度。将我们的遍历分为一层,一层。一般情况下,会用到step来记录每一层。
1.1.2 DFS模板
dfs比较灵活,但是最常用的还是如下参数
d: 表示迭代深度
maxDepth: 表示最大迭代深度
path: 表示当前迭代的路径
res: 一般为结果集
res
void dfs(currVal, d, maxDepth, path)
if(d == maxDepth)
res.push_back(path)
return
for eachChild : findChilds(currVal)
... // 可能有一些判断条件
path.push_back(eachChild)
dfs(eachChild, d+1, maxDepth, path)
path.pop_back();
2. 题目一览
这里盗用一个B站up主的图,花花酱leetcode,我的很多思路都是和他学的。
2.1 排列和组合问题
2.1.1 排列问题
1. 综述
排列问题这里我简单描述小,就是n个元素换位置的问题。明白排列问题是什么比较简单,但难的是如何看出哪些是排列问题。
2. 送上来的排列问题
leetcode-47-全排列
你会发现,大部分的排列问题都会在此基础上变化。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<bool> isVisited(nums.siz