2021-10-11
《算法 4》和《算法导论》不是面向笔试和面试的书籍,对于新接触算法的朋友,可以把它们作为在「力扣」刷题的参考书,遇到什么知识点不会了,再去查,除非是专业的研究人员,看这两本书的时候建议忽略其中的数学证明和公式,只挑对自己有用的部分来看
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/sort-an-array/solution/fu-xi-ji-chu-pai-xu-suan-fa-java-by-liweiwei1419/
2021-09-14
总的思路就是暴力穷举,其它就是跟题意来解题,没有什么其它特殊的技巧
回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。
2021-09-12
自己写博客:一定要视频优先;一定要发挥自己会总结的特性,注释要非常清楚;一定要一题多解来复习各种数据结果和算法思想;一定要把自己的思路统一起来,理解题意的基础上有哪些思路;一定要把几大模块写清楚:bfs和dfs的真正区别 / 递归、回溯和DFS的区别 / 回溯与暴力兜底和动态规划的区别 / 树、图、Grid和链表的区别 / DFS和前根遍历等的区别 /递归和递归树及n叉树 / 分治法和减治法/二分查找的区别 / 快速排序和归并排序的区别以及Java采用的是什么排序 /堆、栈、队列、哈希表等基本数据结构的使用
人生可以坚持、一以贯之的事情、idea,我要建立这样的网站;比如LeetCode刷题(你看到我这里也是一种缘分,这也不是我的原创,像底层就是数组和链表有很多小伙伴已经提及了)、比如Akamai的修炼,比如各种主题的修炼;
我开视频就是最后的机会了,我已经有了台后的很多总结,现在是需要来到台前了:记得一定要穿着得当;
几大名家:
labuladong - 各种模块的总结
liweiwei1419 - 贼喜欢这逼写的答案,精炼容易理解,贼耐操的解答,赞赞赞,主要是关于回溯
宫水三叶 - 主要也是关于回溯
lucifer - 把所有的树和二叉表都刷完了
nettee 面向大象编程 - 目前看到的最好的bfs,dfs讲解,岛屿类问题的通用解法、DFS 遍历框架
Sweetiee - DFS / BFS
代码随想录 - 也是关于回溯,还有贪心
负雪明烛 - 递归
labuladong: https://labuladong.gitee.io/algo/1/4/
liweiwei1419: https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
宫水三叶: https://leetcode-cn.com/problems/combination-sum-iii/solution/hui-su-suan-fa-jie-zhu-zui-hou-yi-dao-zu-n1lo/
lucifer: https://segmentfault.com/a/1190000038260635, https://lucifer.ren/blog/2020/11/08/linked-list/
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/
https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/
代码随想录:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html#%E7%BB%84%E5%90%88%E9%97%AE%E9%A2%98-2
Sweetiee: https://leetcode-cn.com/problems/number-of-provinces/solution/dfs-bfs-bing-cha-ji-3-chong-fang-fa-ji-s-edkl/
2021-09-11
暴力兜底
想到最优算法确实不容易,但至少你应该能想到算法;DP通常是最优算法,但用DFS能根据题意做出暴力解,然后DP进行优化;
刷题要适量,不要贪多。要完全理清一道题的来龙去脉。多问几个为什么。
这道题暴力法怎么做?暴力法哪有问题?怎么优化?为什么选了这个算法就可以优化?为什么这种算法要用这种数据结构来实现?
2021-09-05
我们总结了树(图),链表问题,我们还面临双指针(滑动窗口)、二分法、动态规划和回溯等专题
LeetCode要求你返回的结果都是有套路的:要么返回int,要么返回数组int[],要么返回List<Integer>,要么返回List<List<Integer>>
你肯定要考虑edge cases
2021-08
Google面试
你的解答需要通俗易懂、且不幼稚;
你的思路要宽泛,从暴力穷举到二分法,再到用hash map来套,而且你要明白时间复杂度;
怎么说呢,又考察你的头脑灵敏度,又要考你对所有算法和数据结构的熟悉度,最后还要考你对语言的熟悉和编码的能力;
我现在掌握的题目有哪些?除非一些:
(1)树题、图、网格、链表,对于它们,我们主要要开展的活动是:搜索、构造与修改,而搜索是重中之重,因为构造与修改建立于搜索之上,搜索只有两种解决方案就是DFS和BFS(前根遍历我们一般只是说遍历,而不是说搜索),通过BFS我们顺带学会了层序遍历(层序遍历期待的结果是二维的)和最短路径(多源BFS),(联系是最好的学习方法)
DFS我们也要掌握环路探测和课程安排,DFS就包括了前序、中序和后序遍历;DFS也涵盖了回溯;DFS是依赖递归,所以良好的归纳总结能力很重要
对于dfs / bfs的练习就是让我熟悉了很多的数据结构,特别是队列;
DFS和BFS的目的是搜索,而前根、后根遍历的目的是遍历,这是它们些许不同的地方;(其实搜素和遍历意思差不多;所谓遍历(Traversal),是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。访问结点所做的操作依赖于具体的应用问题, 具体的访问操作可能是检查节点的值、更新节点的值等。)
BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。
树的特点:由于从给定的某个节点出发,有多个可以前往的下一个节点(树不是线性数据结构),所以在顺序计算(即非并行计算)的情况下,只能推迟对某些节点的访问——即以某种方式保存起来以便稍后再访问。常见的做法是采用栈(LIFO)或队列(FIFO)。
在二叉树上我们一般称其为遍历,在图上我们一般称其为搜索,不管遍历或搜索,之后都要做一些检查、更新;
(2)动态规划:递归和递推双套路随你挑选;
(3)滑动窗口:快慢指针、前后指针等
(4)二分还是比较难,需要多练习,分治思想也在这里涵盖了
(5)贪心总是那么玄幻,总结出规律得花一定时间