《算法》备忘录
本文用于在算法学习过程中,总结相关算法套路以及算法编写经验,以备查阅。
算法复杂度及其分析算法复杂度表示方法:
$O$:表示算法的渐进上界
$\Omega$:表示算法的渐进下界
$\Theta$:表示算法的渐进紧确界
递归算法复杂度分析:
递归树方法:节点的总个数就是这个算法的时间复杂度
代入检测法:猜测时间复杂度,然后代入看是否满足题意,最后归纳总结
差分方程法:首先计算出对应的齐次方程解,然后代入初始值求解常数项目
主方法:令 $a \ge 1, b > 1$ 是常数,$f(n)$ 是一个函数,T(n) 是非负整数上的递推式: $$ T(n) = aT(\frac{n}{b}) + f(n) $$ T(n) 有以下方法紧确界:
如果存在 $\epsilon > 0$,使得 $f(n) = O(n^{log_ba - \epsilon})$,则 $T(n) = \Theta(n^{log_ba})$
如果 $f(n) = O(n^{log_ba})$,则 $T(n) = \Th ...
LeetCode Rush
本文用于记录在算法题目中使用的技巧或者方法,以备查阅。
链表问题
使用双指针可以解决找固定位置相关问题,环形链表问题,相交链表问题,旋转链表问题
尝试设置 dummyHead 节点,用于处理特殊情况
只知道要删除的节点,实现该节点的删除
头插法和尾插法的不同点,可以使用头插法实现链表的反转,也可以直接使用迭代方法
链表反转问题:全部反转(迭代,递归,头插法),部分反转(递归,迭代),k 个一组翻转(递归,迭代)
合并链表问题:合并两个链表,合并 k 个链表
判断回文链表:使用额外数据结构,反转后半部分的链表再进行比较,使用后序遍历来比较(链表只存在前序和后序)
二叉树问题
二叉树遍历分为 BFS(层次遍历),DFS(前序,中序,后序遍历)
在解决二叉树的问题过程中,通常和其递归遍历框架存在关系,而在编写递归算法中,最关键的是要明确函数的定义是什么,然后使用这个递归推到最终结果,而不要跳入到递归的细节中去
递归解决二叉树问题:左右翻转二叉树,二叉树展开为链表(先序),填充每个节点的下一个右侧节点指针(注意不同父节点下的关系),将数组构建为最大二叉树,二叉树最大深度,判断 ...