算法合集- 1

135 阅读2分钟

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

根据labuladong的算法秘籍开刷,记录每日刷题成果。今日开个小头:框架思维、算法本质以及数组中的前缀和数组。

整个刷题顺序的建议是:先算法秘籍,再刷题笔记进行练习,其中用leetcode时可以根据插件对应到刷题笔记中的简明思路。

框架思维

框架思维即指一通百通:跳出细节,了解本题本质,从整体了解底层逻辑。

数据结构存储方式

数据结构存储方式分为数组和链表。
散列表:散列函数把键映射到数组中。拉链法即数组+链表特性。线性探查法即数组+数组特性。
栈和队列:数组/链表
树:堆 - 完全二叉树 - 数组实现。普通树【二叉搜索树,AVL树,红黑树,区间树,B树】- 链表实现。
图:邻接表 - 链表实现。邻接矩阵 - 二维数组实现。

数组和链表优缺点

数组:连续存储,随机访问 - 索引查找,速度快,相对节省空间。插入删除难 - O(n)
链表:不连续,插入删除易,查找O(n)

数据结构基本操作

数据结构基本操作 - 遍历+访问。
我们需要做的就是如何高效的增删改查。

遍历+访问的形式
  1. 线性。
    线性即 for/while 数组:线性迭代,链表:迭代/递归
  2. 非线性。
    非线性即 递归
    二叉树:递归 - N叉树遍历递归 - 图遍历递归【好几棵N叉树】

算法本质

算法本质:穷举 - 如何聪明的穷举。

如何穷举

递归类问题 - 动态规划系列问题。

如何聪明的穷举

数组/单链表

双指针 - 二叉搜索【两端向中心的双指针】,滑动窗口【快慢双指针】

前缀和 & 差分数组技巧。

前缀和技巧:预计算 preSum - 避免循环。
差分数组技巧:维护一个diff数组 - 避免循环。

二叉树系列。

  1. 遍历一遍二叉树 - 回溯算法核心框架。
  2. 分解问题计算出答案 - 动态规划核心框架。