数组
数组是存放在连续内存空间上的相同类型数据的集合。
经典题目: 二分查找 双指针法 滑动窗口 模拟行为
链表
- 链表的种类主要为:单链表,双链表,循环链表
- 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。
链表的基本操作
- 获取链表第index个节点的数值
- 在链表的最前面插入一个节点
- 在链表的最后面插入一个节点
- 在链表第index个节点前面插入一个节点
- 删除链表的第index个节点的数值
链表操作中一个重要的技巧:虚拟头节点。
面试考察链表的操作其实就是考察指针的操作
哈希表
一般来说哈希表都是用来快速判断一个元素是否出现集合里。
常见的三种哈希结构:
- 数组
- set(集合)
- map(映射)
经典题目
数组作为哈希表
set作为哈希表
map作为哈希表
字符串
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组。
使用库函数的情况:题目关键的部分直接用库函数就可以解决,建议不要使用库函数。如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数
字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。
双指针法是字符串处理的常客。
KMP算法是字符串查找最重要的算法。
栈与队列
栈:先进后出
栈经典题目
括号匹配
字符串去重
逆波兰表达式
队列:先进先出
队列经典题目
滑动窗口最大值
求前K个高频元素
二叉树
回溯算法
回溯算法能解决如下问题:
- 组合问题:N个数里面按一定规则找出k个数的集合
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 棋盘问题:N皇后,解数独等等
回溯法模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
贪心算法
从局部最优推出全局最优
动态规划
动规五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组