- https://space.bilibili.com/206214/channel/collectiondetail?sid=842776&ctype=0
- https://leetcode.cn/problemset/
- https://www.programmercarl.com/
暴力做法每次拿两个数出来相加,和 target 比较,那么花费 O(1) 的时间,只获取了 O(1) 的信息。 而哈希表做法,每次查询都能知道 O(n) 个数中是否有 target−nums[j],那么花费 O(1) 的时间,就获取了 O(n) 的信息。 来自灵神的力扣题解
- 哈希的作用是用 O(1)的时间复杂度查找元素是否存在于集合中。
- 双指针的作用是遍历的时候优化时间复杂度。
一般而言,双重循环的复杂度是 O(n^2),而双指针通过头尾指针一次遍历将复杂度降到了 O(n)。
- TODO:快排手写(面试常考)
使用回溯的主要目的是判断需要枚举每个路径,例如需要枚举子集,需要枚举二叉树每个节点判断目标和,所以会造成2的n次方的时间复杂度。通常可以通过剪枝减少一部分杂余的时间
回溯的使用场景:
- 组合与排列问题(子集)
- 约束满足问题(找target类型)
- 路径搜索问题(二叉树的目标和)
动态规划的是由于在某一定的条件下(区别一维和二维)每次计算都会有某些部分被重复计算了,所以要减少重复的计算。
动态规划的使用场景:
- 重叠子问题(公共子序列)
- 序列问题(最长递增子序列)
- 划分问题(恰好装满:分割等和自子集)
- 一个常用的比较字符串字母出现次数相等/不考虑顺序的子串的方法:用一个数组或者Map统计频率,比用集合高效且不容易出错
- 前缀和常用于求和的题目中,作用在于提前记录从0开始的数组的和,然后将求某区间的和的时间复杂度从O(n)转化为O(1)
- 单调队列三步:入、出、记录值
- 206 反转链表(快手一面)
- 手写LRU(快手二面)