1.dfs和bfs的总结
dfs: 关键点:
1.什么时候用?
在矩阵中或图或其他类似的存储结构中要找任意到一条可行解 或问是否能有解或指定一条路线看这个图中能否找到这样一条路(这个是最明显的不能用bfs的,因为bfs时点旁边的可行点在第一轮就被标记走过了,如果后来又需要这个第一轮已经被标记过的某个点则因为标记数组的原因无法匹配路线中的一个点,造成无法找到路线,例子:剑指offer矩阵中的路径)
2.起点一定要先用标记数组标记上,代表从起点出发,起点已经访问过了,否则会出问题。
3.dfs函数中首先要写返回条件。第二,想在每一层搜索中要干的事,必须把这一层的事都干完了,才能递归搜索下一层
4.主要数据结构:标记数组,四个方向的对应数组(fx[4]={0,0,1,-1})
bfs: 关键点:
1.需定义的数据结构:
标记数组,队列,结构体(最重要的部分,其中有记录状态的变量,位置信息,通常定义两个结构体变量:p和temp,p用来接收每次从队首取出的结构体,temp接收从当前状态能变成的其他状态)
2.标记初始状态
3.适合求找最短或时间最少并没有具体要找的路线情况下使用
2.树相关
1.传过来的指针要先判断是否为nullptr是空节点直接返回false这里经常挖坑,汇报数组越界的RE的错误
3.数学相关
1.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
ans=n&n-1,这个ans就是n去掉二进制最后面一位的1后的结果,上述问题一个while循环即可搞定
while(n!=0){
sum++;
n=n&(n-1);
}
sum为1的个数
o=x&-x(俗称lowbit函数)o是取x的最后一个1这位以前全变成0后的十进制值
如3 二进制11 3&-3=001(二进制)=1 3-3&-3=3&(3-1)=2=11(二进制)
公式:n&(n-1)=n-lowbit(n)=n-(n&-n);
4.字符串相关
1.常用的字符ASCII码的值都大于‘!’(叹号),所以记录一个字符串字符出现的次数(在不确定输入的字符是什么的时候)就减去叹号就行,记录数组开100就足够了,例题就如剑指offer中的字符流中第一个不重复的字符。
5.剑指offer较难题:
1.正则表达式