- 有序数组
首先可以想到二分
- 无重复数组
- 二叉搜索树
首先可以想到中序遍历
- 数组元素几乎出现偶数次 个别奇数次
首先要想到异或
- 求topK
小根堆,大根堆 数组类排序后直接取 优化版的快速选择算法
- 求倒数第k个
链表可以采用快慢指针 数组可以直接取
- 判断链表是否有环
可以采用快慢指针 时间换空间 可以采用哈希表 空间换时间
- 求若干数之和
有序数组可以采用双指针两端逼近 无序数组先排序
- 字符匹配
穷举 贪心回溯
- 求中位数
一个大根堆和一个小根堆
- 求topK个数之和
可以使用堆 并维护一个和 对堆的任何修改都同步修改这个和
- 求出现次数只有1次
哈希表统计次数 若其他数组都出现了偶数次 那么可以采用异或
- 求缺少的数
哈希表 异或
- 括号(或其他类似的)匹配
采用栈(当只关注栈深度时 可以直接用数字保存)
- O(1)
常数级别的可能有栈,队列
- O(N)
O(N)级别的可能有双指针
- O(logK)
低于O(logN)的首先想到堆
- O(logN)
带对数的首先想到二分
- O(NlogK)
可以想到若干次遍历 每次遍历过程中操作一次堆
- O(NlogN)
可以想到若干次遍历 每次遍历过程中进行一次二分
- 穷举
- 迭代
- 递归
- 递推
- 动态规划
- 双指针
- 快慢指针
- 滑动窗口
- 穷举
- 贪心
- 动态规划
- 迭代
- 递归
- 二分
- 栈
- 单调栈
- 队列
- 单调队列
- dfs
- bfs
- 最短路径