6.4 剑指Offer
- 数组中重复的数字(set、原地交换)
- 二维数组中的查找(旋转45度类似二叉树,比较排除一行或一列)
- 替换空格(遍历添加、原地扩展,反向遍历)
- 从尾到头打印链表(递归、辅助栈)
- 根据前序遍历和中序遍历重建二叉树(划分左右子树递归处理)
- 两个栈实现队列(一个栈负责入队,一个栈负责出队)
- 斐波那契数列(a, b)
- 青蛙跳台阶,一步或两步(动态规划)
- 旋转数组的最小数字(二分法,与首尾元素比较)
- 矩阵中的路径组成单词(深度优先搜索+标志+剪枝)
- 机器人运动范围,矩阵索引的位数和小于某个数(DFS/BFS)
- 剪绳子,整数长度,最大乘积是多少(切成长度为3的等分段)
- 二进制数中1的个数(循环移位与1、n&(n-1))
6.5
- 数值的整数次方(快速幂,二分法)
- 打印从1到最大的n位数(考虑大数使用字符串全排列递归)
- 正则表达式匹配'.','*'(动态规划)
- 表示数值的字符串(有限状态自动机)
- 调整数组顺序使奇数位于偶数前面(收尾双指针,快慢双指针)
- 链表中倒数第k个节点(双指针)
- 反转链表(双指针、递归)
- 合并两个排序的链表(伪头节点)
6.6
- 树的子结构(先序遍历+包含判断)
- 二叉树的镜像(递归/辅助栈)
- 对称的二叉树(递归)
- 顺时针打印矩阵(设定边界)
- 包含min函数的栈(数据栈、辅助栈)
- 栈的压入、弹出序列(模拟压栈出栈操作)
- 从上到下打印二叉树(层序遍历BFS)
- 按行从上到下打印二叉树(层序遍历BFS,辅助列表)
- 之字形从上到下打印二叉树(层序遍历BFS,双端队列)
6.7
- 二叉搜索树的后序遍历序列(递归分治/单调栈)
- 二叉树中和为某一z值的路径(回溯法)
- 复杂链表的复制(哈希表,拼接加拆分)
- 二叉搜索树与双向链表(中序遍历)
- 序列化二叉树(层序遍历BFS)
- 字符串的排列(回溯法)
6.8
- 数组中出现次数超过一半的数字(摩尔投票法)
- 最小的K个数(基于快速排序的数组划分)
- 数据流中的中位数(优先队列/堆)
- 连续子数组最大和(动态规划)
- 1~n整数中1出现的次数(分类讨论每一位)
- 数字序列中某一位的数字(判断位数、数字、数字中的哪一位)
- 把数组排成最小的数(自定义排序)
- 把数字翻译成字符串(动态规划)
- 礼物的最大价值(动态规划)
- 最长不含重复字符的子字符串(动态规划加哈希表)
- 第n个只包含2、3、5因子的丑数(动态规划)
- 第一个只出现一次的字符(哈希表、有序哈希表)
6.9
- 数组中的逆序对(归并排序)
- 两个链表的第一个公共节点(双指针浪漫相遇)
- 在排序数组中查找数字出现次数(二分法)
- 0~n-1中缺失的数字(二分法)
- 二叉搜索树第k大节点(中序遍历)
- 二叉树深度(后序遍历、层序遍历)
- 判断是否为平衡二叉树(后序遍历+剪枝)
- 数组中数字出现的次数2个数1次,其余2次(分组异或)
- 数组中数字出现的次数1个1次,其余3次(计算每位1出现次数,除3求余)
- 和为s的两个数字(双指针)
- 和为s的连续正数序列(滑动窗口)
- 翻转单词顺序(双指针/库函数)
- 滑动窗口的最大值(双端队列)
6.10
- n个骰子的点数(动态规划)
- 扑克牌中的顺子(最大值-最小值,不重复)
- 圆圈中剩下的数字(约瑟夫环,动态规划)
- 股票的最大利润(动态规划)
- 求1+2+...+n(逻辑运算符+递归)
6.16
- 不用加减乘除做加法(循环位运算求进位以及无进位和)
- 构建乘积数组(维护元素左边和右边的乘积)
- 字符串转换成整数(ASCII码,越界处理)
- 二叉搜索树的最近公共祖先(迭代)
- 二叉树的最近公共祖先(后序遍历迭代)