2020.04.03

1.存储方式

数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)

数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)

链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间

2.基本操作

  • 线性就是 for/while 迭代为代表
  • 非线性就是递归为代表

3.刷题路线

先刷二叉树


动态规划解题套路

递归算法的时间复杂度怎么计算?子问题个数乘以解决一个子问题需要的时间

  • 重叠子问题
  • 备忘录优化
  • 解法
    • 自上而下:递归
    • 自下而上:带dp数组的迭代
  • 状态转移方程 -(暴力解公式)

二维数组的遍历方式:

  • 正序
  • 倒叙
  • 斜序

回溯算法套路

解决一个回溯问题,实际上就是一个决策树的遍历过程 回溯算法就是个多叉树的遍历问题,关键就是在前序遍历和后序遍历的位置做一些操作

1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件

案例:

  • 全排列
  • N皇后

keyword:

  • 画决策树

二分法套路

  • 整体简单,但边界条件,细节很重要
  • 左边界和右边界搜索
  • 定义区间

滑动窗口套路

1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
2、我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 T 中的所有字符)。
3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。
4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。