这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
根据labuladong的算法秘籍开刷,记录每日刷题成果。今日开个小头:框架思维、算法本质以及数组中的前缀和数组。
整个刷题顺序的建议是:先算法秘籍,再刷题笔记进行练习,其中用leetcode时可以根据插件对应到刷题笔记中的简明思路。
框架思维
框架思维即指一通百通:跳出细节,了解本题本质,从整体了解底层逻辑。
数据结构存储方式
数据结构存储方式分为数组和链表。
散列表:散列函数把键映射到数组中。拉链法即数组+链表特性。线性探查法即数组+数组特性。
栈和队列:数组/链表
树:堆 - 完全二叉树 - 数组实现。普通树【二叉搜索树,AVL树,红黑树,区间树,B树】- 链表实现。
图:邻接表 - 链表实现。邻接矩阵 - 二维数组实现。
数组和链表优缺点
数组:连续存储,随机访问 - 索引查找,速度快,相对节省空间。插入删除难 - O(n)
链表:不连续,插入删除易,查找O(n)
数据结构基本操作
数据结构基本操作 - 遍历+访问。
我们需要做的就是如何高效的增删改查。
遍历+访问的形式
- 线性。
线性即 for/while 数组:线性迭代,链表:迭代/递归 - 非线性。
非线性即 递归
二叉树:递归 - N叉树遍历递归 - 图遍历递归【好几棵N叉树】
算法本质
算法本质:穷举 - 如何聪明的穷举。
如何穷举
递归类问题 - 动态规划系列问题。
如何聪明的穷举
数组/单链表
双指针 - 二叉搜索【两端向中心的双指针】,滑动窗口【快慢双指针】
前缀和 & 差分数组技巧。
前缀和技巧:预计算 preSum - 避免循环。
差分数组技巧:维护一个diff数组 - 避免循环。
二叉树系列。
- 遍历一遍二叉树 - 回溯算法核心框架。
- 分解问题计算出答案 - 动态规划核心框架。