- 滑动窗口
应用场景:
(1) 输入是线性数据结构,比如链表,数组,字符串
(2) 问题是找到最长或者最短的子串或者找到一个期望值
典型案例:
(1) 给定长度为k,求和最大的子数组
(2) 有‘k’个不同字符的最长的子字符串
(3) 字符串回文构词法 - 双指针
应用场景:
(1) 从有序数组(链表)中找到一组满足特定约束的元素
(2) 这一组元素要么是二元组,要么是三元组,甚至多元组
典型案例:
(1) 求有序数组的平方
(2) 找到和为0的三元组
(3) 比较包含回车的字符串 - 快速指针和慢速指针(慢指针在一圈内一定会与快指针相遇)
应用场景:
(1) 问题是解决链表或者数组内的循环
(2) 寻找一个链表中的某个特定的元素或者求链表的总长
典型案例:
(1) 循环链表
(2) 回文链表
(3) 循环数组中的圈 - 合并区间(如果存在重叠区间需要找出这些重叠区间或者合并区间)
应用场景
(1) 生成没有交集的列表
(2) 重叠区间
典型案列
(1) 区间交集
(2) 最大的CPU负载 - 循环排序(给定一定范围内的连续数)
应用场景
(1) 涉及到给定范围内的数字的有序数组
(2) 在有序或者轮转数组中找到缺失或者重复或者最小的数
典型案例
(1) 找到缺失的数
(2) 找到缺失的最小正数 - 链接链表最佳翻转方案(在一定的限制条件下翻转链表,比如不能使用额外的空间)
应用场景:不能使用额外的空间的情况下翻转链表
典型案列
(1) 翻转子链表
(2) 翻转子链表的每k个元素 - 广度遍历树(基于广度优先搜索技术遍历树,在跳到下一层级之前使用队列来记录当前层的所有节点,判断条件为队列是否为空)
应用场景:涉及到层次遍历树
典型案列
(1) 二叉树的层次遍历
(2) 之字形遍历 - 深度遍历树(基于深度优先检索技术遍历树,可以使用递归或者栈,判断条件为当前节点是否是叶子节点)
应用场景
(1) 前序,中序或者后序遍历树
(2) 需要搜索接近叶节点的一些任务
典型案列
(1) 求树中值的和为特定值的路径
(2) 满足某些条件的路径的条数 - 双堆(涉及二叉搜索)
应用场景
(1) 优先队列,调度场景
(2) 从一个集合中找到最大,最小,居中的元素
(3) 以二叉树结构为特征的问题
典型案列:找到一个序列的中值 - 子集
- 改进的二叉搜索(找出某个确定的元素,最好的方法就是二分搜索)
应用场景
(1) 无序的二叉搜索
(2) 在一个有序的无穷的列表中搜索
典型案列
一般的解答方法
(1) 找到中位数
(2) 如果查找的数等于该中位数,返回该中位数;如果查找的数小于该中位数,搜索列表的前面部分;否则搜索列表的后面部分 - 前k个元素
应用场景
(1)从给定的集合中找出最大的(最小的,最常出现的)前k个元素的问题
典型案列
(1) 前k个数
(2) 前k个频繁出现的数字
一般解答方法
(1) 往小顶堆插入k个元素
(2) 遍历剩余的元素,如果发现一个比堆内的其中一个数据大时,移除堆顶元素,并将当前数插入 - K路合并
应用场景
(1) 以有序数组,列表或者矩阵为特征的问题
(2) 合并有序列表,或者是查找有序列表的最小元素的问题
典型案列
(1) 合并k路有序列表
(2) 可以得到最大和的k个数对
解题的一般方法
(1) 将每个队列的第一个元素都插入小顶堆
(2) 取出堆顶(最小)元素,将其添加到合并的列表内
(3) 从堆顶移除最小的元素过后,将与移除元素相同的列表内的下一个元素插入堆
(4) 重复第二步和第三步,生成合并后的有序列表 - 拓扑排序
应用场景
(1) 处理没有环的图
(2) 问题涉及按顺序更新所有对象
(3) 存在遵循特定顺序的一类对象
典型案列
(1) 任务调度
(2) 树的最小高度
解题的一般方法
(1) 初始化:使用hashmap将图形存储在相邻列表中,找到所有的源节点,并使用hashmap保存节点的度数
(2) 创建图并求得所有顶点的入度:根据输入创建图,并填充节点的度数
(3) 找到所有的源节点:标记为“O”的节点为源节点,将这些节点存储到队列
(4) 排序:对每个源节点,执行以下操作(将它添加到源节点,从图中获得无它所有的孩子节点,将每个孩子节点的度数减少1,如果孩子节点是源节点,将其加入源节点队列),重复上一步,直到源节点的队列为空
面试编程题模式总结
最新推荐文章于 2021-05-17 04:00:20 发布