Open javaxiaomangren opened 4 years ago
之前一周刷题的感觉有几个:
为了方便复习我整理了一个脑图: https://www.processon.com/view/link/5df9915ae4b06f5f14615e8a
(一) 散列表
冲突解决的解决方法
hash 函数的设计
动态扩容
动态扩容会导致数据搬移重新计算hash值和元素的位置,如果一次搬移的数据过多回到导致散列表性能下降。 一个优化方法是动态搬移, 每次插入数据的试从老的散列表取一个数据插入到新的散列表,老的散列表逐步被清空。
如何设计一个工业级的散列表
根据实际情况选择合适的冲突解决方法, 比如用红黑树代替链表
散列表与双向链表的结合使用
Redis 有序集合
Hash算法及其应用的
(二) 树、二叉树、二叉查找树 一些基本概念前驱、后继节点、父节点、子节点、兄弟节点 节点高度、节点深度 、树的高度 、节点层数
二叉树的遍历
前: 根 -> 左子 -> 右子 中 左子 -> 根 -> 右子 后 左子 -> 右子 -> 根 时间复杂度O(n),使用递归技巧完成
完全二叉树 最后一层靠左排列、其他层满的二叉树 使用数组存储空间是连续的
二叉查找树 一个满足下面条件的完全二叉树 当前节点 > 左子树的节点 当前节点 < 右子树的节点
(三) 递归
递归的思维模式
如何写递归代码 1.终止条件的定义
class Solution: def climbStairs(self, n: int) -> int: mem = {} return self._climb(n, mem) def _climb(self, n: int, mem: dict) -> int: # 1. 递归终止条件 if n <= 2: return n # 2. 处理当前层逻辑 - 这里可以用类似记忆化 if mem.get(n): return mem.get(n) # 3. 去到下一层 res = self._climb(n - 1, mem) + self._climb(n-2, mem) # 4. 清理当前层状态 mem[n] = res return res
加油!
666
之前一周刷题的感觉有几个:
为了方便复习我整理了一个脑图: https://www.processon.com/view/link/5df9915ae4b06f5f14615e8a
(一) 散列表
冲突解决的解决方法
hash 函数的设计
动态扩容
动态扩容会导致数据搬移重新计算hash值和元素的位置,如果一次搬移的数据过多回到导致散列表性能下降。 一个优化方法是动态搬移, 每次插入数据的试从老的散列表取一个数据插入到新的散列表,老的散列表逐步被清空。
如何设计一个工业级的散列表
根据实际情况选择合适的冲突解决方法, 比如用红黑树代替链表
散列表与双向链表的结合使用
Redis 有序集合
Hash算法及其应用的
(二) 树、二叉树、二叉查找树 一些基本概念前驱、后继节点、父节点、子节点、兄弟节点 节点高度、节点深度 、树的高度 、节点层数
二叉树的遍历
前: 根 -> 左子 -> 右子 中 左子 -> 根 -> 右子 后 左子 -> 右子 -> 根 时间复杂度O(n),使用递归技巧完成
完全二叉树 最后一层靠左排列、其他层满的二叉树 使用数组存储空间是连续的
二叉查找树 一个满足下面条件的完全二叉树 当前节点 > 左子树的节点 当前节点 < 右子树的节点
(三) 递归
递归的思维模式
如何写递归代码 1.终止条件的定义