原题号 | 题目 | 数据结构 | 思路 | 注意点及相关题目 |
---|---|---|---|---|
(简单)剑指 Offer 03. 数组中重复的数字 | 数组 | 1.(暴力法 不可取) 两次遍历 2. 在哈希表中添加数据,统计各元素个数,遍历hashmap,找到重复的数字 3.在哈希表中添加数据,如果表中已经有该项,直接返回即可(官方题解用的集合,集合添加失败返回即可) 时间复杂度:O(n) 空间复杂度:O(n) |
||
240 | (简单)剑指 Offer 04. 二维数组中的查找 | 数组 | 1.(暴力法) 时间复杂度:O(nm) 空间复杂度:O(1) 2.线性查找 从左上角或右下角开始查找 时间复杂度:O(n+m) 空间复杂度:O(1) 3.二分法查找 没看 240官方题解 |
|
(简单)剑指 Offer 05. 替换空格 | 字符串 | 1.替换函数 2.数空格,直接申请定长字符串 3.StringBuilder申请变长 时间复杂度:O(N) 空间复杂度:O(N) 4.先申请原字符串长度3倍的字符串,复制完之后再按实际长度复制回去 时间复杂度:O(n) 空间复杂度:O(n) |
||
(简单)剑指 Offer 06. 从尾到头打印链表 | 链表 | 1.两次遍历链表 2.辅助栈 时间复杂度:O(n) 空间复杂度:O(n) 3.递归法 先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出 精选题解 时间复杂度 O(N): 遍历链表,递归 N 次。 空间复杂度 O(N): 系统递归需要使用 O(N) 的栈空间。 (剑指offer)1.第一反应 把链表中链接节点的指针反转过来,改变链表的方向,然后从头到尾输出 但是这样会改变链表的结构 (剑指offer)2.辅助栈 用栈基于循环实现的代码鲁棒性要好一些 (剑指offer)3.递归法 递归在本质上就是一个栈结构 基于递归的代码看起来简洁,但是当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出 |
复习时自己实现了一遍 | |
105 | (中等)剑指 Offer 07. 重建二叉树(根据前序和中序遍历) | 树 | 1.递归法 用一个 Map 存储中序遍历的每个元素及其对应的下标,使用hashmap提高搜索效率 时间复杂度:O(n) 空间复杂度:O(n) 2.迭代法 使用栈保存遍历过的节点 时间复杂度:O(n) 空间复杂度:O(n) 只大概看了一下 官方题解 (剑指offer)递归法 |
|
(简单)剑指 Offer 09. 用两个栈实现队列 | 栈 队列 | deque和linkedlist实现栈 利用双栈,一个栈支持插入操作,一个栈支持删除操作 时间复杂度:对于插入和删除操作,时间复杂度均为 O(1)。插入不多说,对于删除操作,虽然看起来是 O(n)O(n) 的时间复杂度,但是仔细考虑下每个元素只会「至多被插入和弹出 stack2 一次」,因此均摊下来每个元素被删除的时间复杂度仍为 O(1)。 空间复杂度:O(n)。需要使用两个栈存储已有的元素。 (剑指offer)双栈法 同上 |
拓展:用两个队列实现栈 | |
509 | (简单)剑指 Offer 10- I. 斐波那契数列 | dp | 1.递归(超时) 时间复杂度:O(2^N) 空间复杂度:O(N) 2.记忆化递归 时间复杂度:O(n) 空间复杂度:O(n) 3.动态规划 时间复杂度:O(n) 空间复杂度:O(n) 4.动态规划空间优化 时间复杂度:O(n) 空间复杂度:O(1) 5.矩阵求幂 没看 509官方题解 6.公式法 没看 |
复习时自己实现了一遍 |
70 | (简单)剑指 Offer 10- II. 青蛙跳台阶问题 | dp | 思路同上 | dp相关题目:安安总结 |
154. 寻找旋转排序数组中的最小值 II | (简单) 剑指 Offer 11. 旋转数组的最小数字 | 数组查找 | 二分法 | 相关题目: 153. 寻找旋转排序数组中的最小值 33. 搜索旋转排序数组 81. 搜索旋转排序数组 II |
79. 单词搜索 | (中等)剑指 Offer 12. 矩阵中的路径 | 矩阵 | 矩阵搜索问题 dfs+回溯剪枝 偏移量数组 |
|
200. 岛屿数量 | 矩阵 | 网格问题 岛屿系列问题 1.dfs 通用解法 2.bfs 3.并查集 没看 |
类似题目: 695. 岛屿的最大面积 463. 岛屿的周长 827. 最大人工岛 130.被围绕的区域 |
|
(中等)剑指 Offer 13. 机器人的运动范围 | 矩阵 | 矩阵搜索问题 dfs bfs |
||
343. 整数拆分 | (中等)剑指 Offer 14- I. 剪绳子 | 1.递归 超时 2.动态规划 |
||
剑指 Offer 14- II. 剪绳子 II | 大数求余 1.贪心 快速幂求余 2.BigInteger |
|||
191 | (简单)剑指 Offer 15. 二进制中1的个数 | 方法一:逐位判断 方法二:巧用 n & (n - 1)n&(n−1) |
||
(中等)剑指 Offer 16. 数值的整数次方 | 快速幂 时间: O ( l o g 2 n ) O(log_2n) O(log2n) 空间: O ( 1 ) O(1) O(1) | |||
剑指 Offer 17. 打印从1到最大的n位数 | 普通打印 大数问题:全排列 字符串 |
|||
剑指 Offer 18. 删除链表的节点 | 链表 | 普通遍历删除 新思路:根据删除节点,直接删除 |
新思路类型题:面试题 02.03. 删除中间节点 | |
(简单)剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 | 数组 | 1.头尾指针 题解1 题解2 2.快慢指针 题解1 |
同类型问题扩展 解耦 lambda表达式 | |
(简单)剑指 Offer 22. 链表中倒数第k个节点 | 链表 | 快慢指针 鲁棒性 要考虑特殊情况 | ||
206 | (简单)剑指 Offer 24. 反转链表 | 链表 | 206官方题解 1. 迭代 修改next指针 2.递归 |
|
21 | 剑指 Offer 25. 合并两个排序的链表 | 链表 | 21官方题解 1.迭代 2.递归 |
|
剑指 Offer 26. 树的子结构 | 树 | 递归 | 匹配类二叉树题目总结 安安总结 面04.10(572) 剑指offer28(101) 100 1367(没看) |
|
101 | 剑指 Offer 28. 对称的二叉树 | 树 | 101官方题解 1.递归 2.非递归 (队列) |
|
226 | 剑指 Offer 27. 二叉树的镜像 | 树 | 226官方题解(递归 队列) 大佬题解(栈) 1.递归 2.非递归(栈 队列) |
|
剑指 Offer 32 - I. 从上到下打印二叉树 | 树 | 队列(BFS) | 二叉树层级遍历(BFS) | |
剑指 Offer 32 - II. 从上到下打印二叉树 II | 1.队列(BFS) 相比于上一题加了一个循环 参考 2.递归(通过DFS来实现) 参考 |
BFS 的使用场景总结:层序遍历、最短路径问题 最短路径部分没看 | ||
剑指 Offer 32 - III. 从上到下打印二叉树 III | 1.双端队列(BFS) 2.递归 首尾两头添加 双栈法 (剑指offer) |
|||
155 | 剑指 Offer 30. 包含min函数的栈 | 栈 | 1.辅助栈和数据栈同步 155官方题解 2.辅助栈和数据栈不同步(要考虑新来的数等于辅助栈栈顶元素的时候) 参考题解 |
|
54 | 剑指 Offer 29. 顺时针打印矩阵 | 矩阵 | 1.模拟矩阵路径 2.按层模拟 |
|
946 | 剑指 Offer 31. 栈的压入、弹出序列 | 栈 | 模拟 | |
剑指 Offer 33. 二叉搜索树的后序遍历序列 | 树 | 1.递归分治 2.辅助栈 (没看) |
||
113. 路径总和 II | 剑指 Offer 34. 二叉树中和为某一值的路径 | 树 | dfs | 二叉树搜索问题 112.路径总和 437.路径总和III |
138 | 剑指 Offer 35. 复杂链表的复制 | 1.哈希表 时间复杂度:O(N) 空间复杂度:O(N) 2.原地复制 时间复杂度:O(N) 空间复杂度:O(1) |
||
剑指 Offer 38. 字符串的排列 | 全排列 | 46 47 |
||
169 | 剑指 Offer 39. 数组中出现次数超过一半的数字 | 摩尔投票法 | ||
剑指 Offer 40. 最小的k个数 | top K问题 1.大根堆 2.利用快排思想,但不需要对所有元素都进行排序 |
类似题目: 215. 数组中的第K个最大元素 |
||
53 | 剑指 Offer 42. 连续子数组的最大和 | 动态规划 | ||
233 | 剑指 Offer 43. 1~n整数中1出现的次数 | 数学法 找规律 分为三种情况:等于1 等于0 大于1 | ||
400 | 剑指 Offer 44. 数字序列中某一位的数字 | 数学法 找规律 参考题解 | ||
剑指 Offer 45. 把数组排成最小的数 | 自定义排序规则 | |||
剑指 Offer 46. 把数字翻译成字符串 | dp | |||
剑指 Offer 47. 礼物的最大价值 | dp 像一维数组一样,多开一点空间,有利于边界条件的判断 | |||
3 | 剑指 Offer 48. 最长不含重复字符的子字符串 | 滑动窗口 参考题解 动态规划 参考题解 |
滑动窗口题目总结 (没看) | |
264 | 剑指 Offer 49. 丑数 | 动态规划 堆 |
||
剑指 Offer 50. 第一个只出现一次的字符 | 哈希表 有序哈希表 |
|||
160 | 剑指 Offer 52. 两个链表的第一个公共节点 | 哈希表 双指针浪漫相遇 |
||
剑指 Offer 54. 二叉搜索树的第k大节点 | 遍历顺序:右根左 则输出顺序即从大到小 | |||
104 | 剑指 Offer 55 - I. 二叉树的深度 | DFS递归 BFS |
相似题目:从上到下打印二叉树 | |
110 | 剑指 Offer 55 - II. 平衡二叉树 | DFS递归 利用特殊值进行剪枝,提前返回 |
||
剑指 Offer 53 - I. 在排序数组中查找数字 I | 二分查找 寻找左右边界 三种解法 安安题解 | 排序数组中的搜索问题,首先想到 二分法 解决。 二分查找规律 安安总结二分查找规律 |
||
剑指 Offer 53 - II. 0~n-1中缺失的数字 | 二分查找 类似于上题的±0.5 因此都是数组中不存在那个数值的情况 | |||
剑指 Offer 56 - I. 数组中数字出现的次数 | 异或 | 本题的基础题:136. 只出现一次的数字 | ||
剑指 Offer 56 - II. 数组中数字出现的次数 II | 位运算+逐位统计 参考题解 | |||
剑指 Offer 57. 和为s的两个数字 | 双指针 改进:二分法+双指针 |
|||
剑指 Offer 57 - II. 和为s的连续正数序列 | 双指针 (滑动窗口) | |||
151 | 剑指 Offer 58 - I. 翻转单词顺序 | 1.API 2.双指针 参考题解 3.先反转所有字符,再反转各个单词(剑指offer) 151 official 栈 定位单词边界 |
||
剑指 Offer 58 - II. 左旋转字符串 | 1. 三次翻转 2.字符串拼接+求余简化代码 |
|||
剑指 Offer 60. n个骰子的点数 | 参考题解 dp二维数组 dp空间优化为一维数组 (此处和其他地方不一样,其他地方都是优化为两行n列的二维数组) |
|||
剑指 Offer 61. 扑克牌中的顺子 | 数组 | 1.普通思路:判断0的个数和所需的0的个数 2.巧妙思路:找到最大值和最小值,判断max-min < 5 参考题解 |
||
剑指 Offer 65. 不用加减乘除做加法 | 位运算 参考题解 | |||
剑指 Offer 66. 构建乘积数组 | 1.暴力法 2.双指针 |
|||
剑指 Offer 67. 把字符串转换成整数 | 1.正则这个题解下面的一个评论 2.直接遍历判断(注意越界情况) 参考题解 |
这道题目如果只是简单地字符串转整数的话,就是简单地 ans = ans * 10 + digit。但是注意这道题目可能会超过integer的最大表示!也就是说会在某一步 ans * 10 + digit > Integer.MAX_VALUE。*10 和 +digit 都有可能越界,那么只要把这些都移到右边去就可以了。ans > (Integer.MAX_VALUE - digit) / 10 就是越界。 | ||
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 | 要利用二叉搜索树的性质 参考题解 | |||
剑指 Offer 68 - II. 二叉树的最近公共祖先 | 递归 | |||
C = W ∗ log 2 ( 1 + s n ) C=W\ast\log_2\left ( 1+\frac{s}{n} \right ) C=W∗log2(1+ns)
原题号 | 题目 | 范畴 | 思路 |
---|---|---|---|