lc刷题笔记-搜索算法-dfs, bfs

搜索算法主要是基于BFS和DFS实现的,刷题参考了labuladong的解题模板。刷题过程中比较困惑我的几个点,比如dfs和batcktrack的区别,dfs什么时候有需要返回值,什么时候不需要(most case,如8岛屿数量)

DFS和backtrack的区别:
1.backtrack需要对遍历的position做选择,遍历每一种选择,同时dfs下一个,再撤回选择,如lc8皇后,解数独
2.dfs不需要做选择,只需走下去,同时跳过已经遍历过的点;

什么时候主函数需要遍历,什么时候主函数只需要调用一次:
1. backtrack主函数不需要遍历,只需要调用即可
2. dfs由于不一定能达到所有node,因此需要在主函数for遍历所有node,如岛屿问题

什么时候用DFS,什么时候用BFS:
1.用BFS:
a.最少情况用BFS:可以提前结束,如111叉树最小深度,如773滑动谜题;
b.拓扑问题用,如lc210 课程表2
2.用DFS:BFS解决不了的问题:,可以用DFS,如岛屿问题。感觉几乎BFS的问题都可以用DFS解决;BFS的优势是可以在最小深度提前结束。缺点是空间复杂度受宽度影响

dfs深搜函数:
什么时候需要返回值:需要记录dfs深度或数量信息的,如695岛屿的最大面积
什么时候不需要返回值:只需要dfs标记是否访问过即可,如200岛屿数量
全部评论

相关推荐

我前面的帖子还奇怪为啥招行信用卡笔试软件开发岗位只有行测,后来一看今天还有个专门的技术类笔试我收回之前说的“感觉适合计算机基础不好的同学”,倒不能说是全错,只是一点基础没有还是没法做的这次是软件开发岗和算法岗一起考了,前面通用的题有16个单选和一个编程题,后面两个岗位有各自的一道编程题,二选一即可,语言不限,有意思的是作为js选手竟然分开提供了v8和node,虽然二者在编程题里面区别真的很小前面的选择题怎么说呢,感觉比较适合java选手,我是前端选手,不过是科班出身,里面有些知识还是学过的,就是有些东西可能前端不咋考所以准备的不好,比如linux命令、一道读java的代码题、一道读python的代码题,不过我还是用过,了解过一些东西的,就是linux是真的拿捏不定,因为真的不常用其余的数据结构啥的没难度,还有零星几个简单的机器学习为背景的题,但是考的东西和机器学习也没啥关系通用的编程题不难,就是给一个字符串(都是26个小写字母组成),统计每个字符前面相邻的(注意这个相邻直接减少难度)字符的种类并输出,这个一开始没看到相邻,后来一想相邻真的不难,暴力统计即可,难点还是我是js选手,js里面不能像c++那样用s[i] - 'a'这样进行字符和数字的转换,所以一开始卡了一阵,不过js可以用set统计种类,就是一开始差点忘了set.size这个api软件开发的编程题看起来很唬人,给一个数组,可以操纵1-m的前缀或m-n的后缀,对区间内部所有的数都加一,问能不能把这个数组里面所有的数变成原来数组的最大值。我以为是前缀和来着,其实不是,只要看从前往后递增、从后往前递增即可,只要两个递增区间中间的区间除了两个端点以外还有值就不可能,就是跳出循环的条件一开始写错了,只有25%,后面改了就ac提前一个小时ak交卷,反正做完笔试我就不想动了
投递招商银行信用卡中心等公司10个岗位
点赞 评论 收藏
转发
1 1 评论
分享
牛客网
牛客企业服务