剑指offer题目思路总结

该剑指offer系列所对应的代码都在 剑指offer题目代码总结

原题号 题目 数据结构 思路 注意点及相关题目
(简单)剑指 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=Wlog2(1+ns)

原题号 题目 范畴 思路

你可能感兴趣的:(LeetCode,1024程序员节)