1. 数组
数组是基本的数据结构,面试中考察数组的题目一般在思维上并不复杂,主要是考查面试者对代码的掌控能力。
- 数组下标都是从0开始
- 数组在内存空间的地址是连续的
题目:
- easy
2. 链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,另一个是指针域(存放指向下一个节点的指针),链表的入口节点称为头节点(head),最后一个节点的指针域指向NULL(空指针)。
链表的三种类型:单链表、双链表、循环链表
题目:
- easy
- midding
3. 哈希表
哈希表(Hash Table),散列表,根据关键码的值直接访问数据的数据结构,一般用来快速判断一个元素是否出现在集合中。
哈希碰撞的两种解决方法:拉链法 、线性探测法
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(logn) | O(logn) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
题目:
- easy
-
midding
4. 字符串
字符串是由若干字符组成的有限序列,也可以理解为一个字符数组。
- easy
- midding
5. 栈与队列
队列:先进先出
栈 :先进后出
题目:
- easy
- midding
- hard
6. 二叉树
二叉树的种类:满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树
二叉树的遍历:深度优先 广度优先(递归:栈 队列)
递归三部曲:
(1)确定递归函数的参数和返回值
(2)确定递归终止条件
(3)确定单层递归的逻辑
题目:
7. 回溯算法
(1)确定回溯函数的返回值和参数
(2)确定回溯函数的终止条件
(3)确定回溯函数的遍历过程
//回溯算法的循环:
// 1. 求排列for(int i=0; ...)
// 2. 求组合for(int i=startInd; ...)
//note: 要注意去重问题
题目:
8. 贪心算法
解题步骤:
(1)将问题分解为若干子问题
(2)找出贪心策略
(3)求解每一个子问题的最优解
(4)将局部最优堆叠成全局最优
题目:
9. 动态规划
动态规划“五部曲”
(1)确定dp及下标的含义
(2)确定递推公式
(3)初始化dp
(4)确定遍历顺序
(5)举例推导dp
//0-1背包的核心代码
for(int i=0; i<weight.size(); ++i){
//容量从大到小遍历,保证每个物品仅添加一次
for(int j=bagWeight; j>=weight[i]; --j){
dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
}
}
//完全背包核心代码
for(int i=0; i<weight.size(); ++i){
//容量从小到大遍历,保证每个物品可添加无数次
for(int j=weight[i]; j<=bagWeight; ++j){
dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
}
}
//1. 求最大 dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
//2. 求组合 dp[j] += dp[j-nums[i]]
//3. 求排列 dp[j] += dp[j-nums[i]]
//求组合数,外层循环遍历物品,内层循环遍历背包
//求排列数,外层循环遍历背包,内层循环遍历物品
题目:
10. 其他
-
二分查找
-
递归
-
并查集
-
拓扑排序
-
深度优先
参考文献:《代码随想录lu 跟着Carlarl学算法》 孙秀洋