1 总览
关于数据结构和算法的精炼总结:
- 所有的数据结构,底层皆为数组(顺序存储)和链表(链式存储)
- 数据结构的关键点在于遍历和访问,即元素的增删改查等基本操作
- 所有的算法,本质皆为穷举
- 穷举的关键点在于无遗漏和无冗余。熟悉掌握算法框架,可以做到无遗漏;充分利用信息,可以做到无冗余。
1.1 数据结构的存储方式
如上文所讲,数据结构的存储方式只有两种:数组和链表
1.2 数据结构的基本操作
对于任何数据结构,其基本操作为遍历和访问,具体来讲就是增删改查
- 线性结构:使用
for|while
循环 - 非线性结构:使用递归遍历
2 算法的本质
算法的本质是穷举。
穷举的两个关键:
- 无遗漏:出现遗漏是对算法框架的掌握不到位,不能正确穷举代码
- 无冗余:没有充分利用有效信息
面对一道算法题,两个维度思考:
- **如何穷举?**无遗漏穷举出所有的可能解
- 如何聪明地穷举?避免所有的冗余计算,尽可能少地消耗资源求出答案
2.1 如何穷举?
递归类问题、回溯算法、动态规划算法等算法的解题关键在于如何正确地穷举。
- 回溯算法的核心在于遍历
- 动态规划核心在于分解问题
2.2 如何聪明地穷举?
二分搜索算法、并查集、贪心算法
3 数组|链表系列算法
3.1 单链表
单链表常用的解题技巧为双指针,属于聪明穷举一类。
3.2 数组
数组比较灵活,常见的解题技巧有:
4 二叉树算法
二叉树的递归解法可以分为两类思路,第一类是遍历一遍二叉树得出答案,第二类可以通过分解问题计算出答案。
二叉树常用的解题技巧有:
- 回溯算法
- BFS算法
4.1 遍历思维模式
例如二叉树的前|中|后序遍历等。
4.2 分解问题的思维模式
计算二叉树最大深度的问题,可以使用如下的解法:
int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
// 递归结算左右子树的最大深度
int leftMax = maxDepth(root.left);
int rightMax = maxDepth(root.right);
// 整棵树的最大深度就是左右子树的最大深度 + 1 (根节点)
int res = Math.max(leftMax, rightMax) + 1;
return res;
}
关于二叉树的核心算法,可以参考文章[二叉树算法]