数据结构与算法笔记
2020-07-03 本文已影响0人
读书三万本
1 数据结构
- 列表,基本数据结构,顺序存储结构,可以通过索引快速查找元素,删除和增加元素比较麻烦,特别是增加元素可能要开辟新的存储空间。
- 链表,基本数据结构,链式存储结构,通过node.next访问下一个元素,只能从根节点开始查找元素,元素删除和插入比较简单,不用使用连续的存储空间。
- 队列,一种只允许先进先出的存储结构,支持(enqueue、dequeue功能)
- 栈,一种只允许后进先出的存储结构,支持pop、push,查看head值的功能
- 堆(最大堆/最小堆),一种特殊的完全二叉树,堆顶式是最大值或者最小值,堆可以完全通过一个列表存储,满足:node.parent = i/2, node.left=2i, node.right=2i+1。堆支持插入(直接在堆的最后一个位置插入一个元素,然后维护堆的性质)和删除操作(堆顶和队尾元素交换,然后维护堆的性质)。堆可以用于堆排序、优先级队列(支持最大值有限弹出)中。
- 二叉树,node.value,node.left, node.right。
- 搜索二叉树,指根节点一定比左树的所有节点大,一定比右子树的所有节点值小
- 完全二叉树,树的深度为h,h-1层必须是满的,h层优先填满左边叶节点,可以用数组存储,可以分解为完全二叉树和满二叉树
- 单调栈,保证堆顶式最大的,解决Next greater Number问题
- 单调队列,队列首是最大的
2 算法
- 动态规划:一般用于求解最值,当问题的解可以通过子问题的解来得到时使用,通常子问题存在重叠,通过存储中间结果来减少重复计算。
- 状态定义,确定状态是什么,动态表存储什么
- 转移函数,确定选择并泽优
- 明确边界/badcase,递归时是终止条件;使用dp-table时是初始值的选取
- 二分查找:一个问题一分为二,
- 双指针:通过两个指针优雅地解决问题,在链表的相关问题中常用
- BFS(广度优先):
- DFS(深度优先):
- 滑动窗口: