算法与数据结构
标签(空格分隔): 算法与数据结构
数据结构题目
数组
- 面试题3.1 数组中重复的数字
- 面试题4 二维数组中的查找
- 面试题21 调整数组顺序使奇数位于偶数前面
- 面试题29 顺时针打印矩阵
- 面试题39 数组中出现次数超过一半的数字
- 面试题41 数据流中的中位数
- 面试题42 连续子数组的最大和
- 面试题45 把数组排成最小的数
- 面试题61 扑克牌顺子
- 面试题66 构建乘积数组
字符串
- 面试题5 替换空格
- 面试题20 表示数值的字符串
- 面试题38 字符串的排列
- 面试题50.1 第一个只出现一次的字符位置
- 面试题50.2 字符流中第一个不重复的字符
- 面试题58.1 翻转单词顺序列
- 面试题58.2 左旋转字符串
- 面试题67 把字符串转换成整数
栈和队列
- 面试题9 用两个栈实现队列
- 面试题30 包含min函数的栈
- 面试题31 栈的压入、弹出序列
- 面试题59 滑动窗口的最大值
链表
- 面试题6 从尾到头打印链表
- 面试题18.1 在O(1)时间内删除链表节点
- 面试题18.2 删除链表中重复的结点
- 面试题22 链表中倒数第k个结点
- 面试题23 链表中环的入口结点
- 面试题24 反转链表
- 面试题25 合并两个排序的链表
- 面试题35 复杂链表的复制
- 面试题52 两个链表的第一个公共结点
- 面试题62 圆圈中最后剩下的数
二叉树
- 面试题7 重建二叉树
- 面试题8 二叉树的下一个结点
- 面试题26 树的子结构
- 面试题27 二叉树的镜像
- 面试题28 对称的二叉树
- 面试题32.1 不分行从上往下打印二叉树
- 面试题32.2 把二叉树打印成多行
- 面试题32.3 按之字形顺序打印二叉树
- 面试题33 二叉搜索树的后序遍历序列
- 面试题34 二叉树中和为某一值的路径
- 面试题36 二叉搜索树与双向链表
- 面试题37 序列化二叉树
- 面试题54 二叉搜索树的第k个结点
- 面试题55.1 二叉树的深度
- 面试题55.2 平衡二叉树
算法题目
查找
- 面试题3.2 不修改数组找出重复的数字
- 面试题11 旋转数组的最小数字
- 面试题53.1 数字在排序数组中出现的次数
- 面试题53.2 0~n-1中缺失的数字
- 面试题57.1 数组中和为S的两个数字
- 面试题57.2 数组中和为S的连续正数序列
排序
- 面试题40 最小的k个数
- 面试题51 数组中的逆序对
位运算
- 面试题15 二进制中1的个数
- 面试题56.1 数组中只出现一次的数字(两个)
- 面试题56.2 数组中唯一只出现一次的数字
- 面试题65 不用加减乘除做加法
回溯
- 面试题12 矩阵中的路径
- 面试题13 机器人的运动范围
分治
- 面试题10.1 斐波那契数列
- 面试题10.2 跳台阶
- 面试题10.3 变态跳台阶
- 面试题10.4 矩形覆盖
- 面试题16 数值的整数次方
- 面试题17 打印从1到最大的n位数
- 面试题19 正则表达式匹配
- 面试题43 从1到n整数中1出现的次数
- 面试题44 数字序列中某一位的数字
- 面试题46 把数字翻译成字符串
- 面试题60 n个骰子的点数
- 面试题64 求1+2+3+...+n
动态规划
- 面试题14 剪绳子
- 面试题47 礼物的最大价值
- 面试题48 最长不含重复字符的子字符串
- 面试题49 丑数
贪婪算法
- 面试题14 剪绳子
算法
排序
- 选择排序
- 插入排序
- 冒泡排序
- 快速排序
- 归并排序
- 堆排序
查找
- 二分查找
- 哈希表查找
- 搜索树查找
数据结构
数组
字符串
栈和队列
链表
- 双向链表
- 循环链表
二叉树
二叉树的结构
二叉树的遍历
- 前、中、后序遍历
二叉树的种类
普通二叉树、完全二叉树、满二叉树
二叉搜索树
二叉平衡树
AVL树
红黑树
特性
- 每个节点要么是红色的要么是黑色的
- 根结点是黑色的,叶子结点是黑色的空结点
- 一个结点是红色的,其子结点是黑色的
- 对任意的结点,从该结点到其叶子结点构成的路径上的黑色结点数相同
旋转和变色
变色为了满足RB特性
旋转
左旋
- 左旋的结点的左子结点成为其父结点的右子结点,而其父结点成为其左子结点,最后该结点移动到原父结点的位置
右旋
- 右旋的结点的右子结点成为其父结点的左子结点,而其父结点成为其右子结点,最后该结点移动到原父结点的位置
插入
父结点为黑
- 不变
父结点为红
叔叔为红
- 变色,最后以爷爷作为新的结点继续判定
叔叔为黑
父在左,叔在右,本身在左
- 父结点进行一次右旋转
父在左,叔在右,本身在右
- 本身进行一次左旋转,左旋转后在父结点的位置再进行右旋转
叔在左,父在右,本身在右
- 父结点进行一次左旋转
叔在左,父在右,本身在左
- 本身进行一次右旋转,再进行左旋转
删除(略)
AVL和红黑树的比较
- AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。
- 红黑树用非严格的平衡来降低插入删除时旋转的次数。
哈夫曼树
- F中选择权值最小的两个树(可以是单个节点)合并成一个树并放入F,再选择两个合并,重复直到F只有一棵树为止。
图
图的结构
图的遍历
- DFS
- BFS
并查集
最短路径
- Dijkstra算法
- Floyd算法
最小生成树
- Prim算法
- Kruskal算法