常用数据结构
- 数组与字符串
- 构建简单,o1时间根据下标查询某个元素
- 缺点,构建时必须分配连续空间,查询是否存在需要on,删除和插入元素,需要on
- 链表
- 每个元素是单独的对象,所有的对象通过引用字段链接在一起
- 优点:灵活分配内存空间, 能在o1时间内删除、添加元素
- 缺点:查询需要on时间
- 解题技巧
- 利用快慢指针(有时要用到三个)
- 构建虚假链表头
- 在纸上画出节点之间相互关系,画出修改的方法
- 栈
- 队列
- 双端队列
- 队列的头尾两端都能以o1的时间进行数据查看、添加和删除
- 可以用双链表实现
- 常用场景:实现一个长度动态变化的窗口或者连续区间
- 树
- 结构只管
- 递归算法
- 常考察
- 普通二叉树
- 平衡二叉树
- 完全二叉树
- 二叉搜索树
- 四叉树
- 多叉树
- 遍历
高级数据结构
- 优先队列
- 保证每次取出的元素是队列中优先级最高的
- 本质是二叉堆结构,利用数组结构实现完全二叉树
- 数组第一个元素a[0]拥有最高优先级
- 给定一个下标i,其父节点为(i-1)/2,左孩子是
- 2i+1,右孩子是2i+2
- 数组中每个元素的优先级都必须高于子节点
- 操作
- 向上筛选:插入时放到最后,向上升(olgn)
- 向下筛选:弹出堆顶时把最后一个放到堆顶,向下降(olgn)
- 初始化堆 on
- 图
- 阶
- 度
- 树、森林、环
- 有向图、无向图
- 连通图、连通分量
- 邻接矩阵、邻接链表
- DFS、BFS
- 二部图检测
- 树的检测
- 环的检测(有向图、无向图)
- 拓扑排序
- 并查集
- 最短路径
- 前缀树 Trie
- 也称字典树
- 每个节点必须包含children、isEnd两个属性
- 线段树
- 一种按照二叉树存储数据的结构,每个节点保存的都是数组里某一段的总和
- 更新 olgn
- 求和 olgn
- 树状数组
排序
- 基本排序算法(快速写出没有bug的代码)
- 冒泡:把最大的数冒泡到后端
- 插排:把最小的值插入到合适的位置
- 常考的排序算法(解决绝大部分排序问题的关键)
- 其他(开拓解题思路)
递归与回溯
- 递归:函数调用本身,把大规模问题不断变小
- 简洁、易于理解
- 思路
- 将一个问题规模变小
- 利用小规模问题的结果,结合当前情况,得出下一步结果
- 把需要实现的递归函数看成已经实现好的,直接进行利用
- 需要考虑退出递归的情况
- 是自顶向下的,反之,动态规划是自底向上的,是对递归的一种优化
- 模板
- 判断是否非法,完整性检查
- 判断递归是否应该结束(初始情况)
- 缩小问题规模,递归调用
- 整合子问题结果
- 时间复杂度分析
- 迭代法(初始值开始,使用归纳法)
- 公式法
- T(n) = a * T(n / b) + f(n)
- O(n^logba)
- 回溯:从起始点触发,不断尝试,有时需要返回再做选择,直到抵达终点
- 试探算法,对每一步探测的情况评估,决定是否继续,可以避免走弯路
- 当出现非法情况时,可以退到之前的情景,再去尝试其他的路
- 保证多种尝试可能
- 思路
- 判断是否非法,如果非法立即返回
- 判断是否满足条件,如果是,保存结果并返回
- 在当前情况下,遍历所有可能出现的情况,并进行递归
- 递归完毕后,立即回溯,回溯的方法是取消前一步的改动(栈)
- 时间复杂度分析与递归一致
如何应对算法面试
- 遇到新问题不要慌张,先想出最直观的解法
- 直观解法多数情况不是最优的,可以帮忙打开思路
- 理清解决问题的各个步骤之后,根据问题核心来优化某些关键性步骤
posted @
2019-08-16 23:52
排骨zzz
阅读(
114)
评论()
编辑
收藏
举报