剑指 Offer 系列完结撒花!!
本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考
总的来说, 写这个系列耗费了我不少精力, 不过我也很开心能和大家分享, 真心希望能对大家有所帮助, 也希望大家能够多多点赞转发和分享, 让更多人看到, 谢谢~
接下来我需要休整一段时间来准备新的系列了, 中间也可能会有一些不定期更新. 至于新系列是什么呢? 大家敬请期待
P.S. 公众号即将改名为 算法精选, 更简短和好记, 并且新加了一个暗号 剑指总结. 进入公众号 算法精选, 在聊天框中回复 剑指总结 就能快速定位到这篇文章啦~

数字/数组

剑指 Offer 03. 数组中重复的数字 - leetcode 剑指 offer 系列

  • 下标排序, 不断循环将值放到对应下标位置, 直到发现重复

剑指 Offer 04. 二维数组中的查找 - leetcode 剑指 offer 系列

  • 从左下角或右上角开始

剑指 Offer 11. 旋转数组的最小数字 - leetcode 剑指 offer 系列

  • 二分查找变种, 相等时 e-=1

剑指 Offer 14- I. 剪绳子 - leetcode 剑指 offer 系列

  1. 方法 1: 记忆化搜索, 存当前长度下的最大乘积
  2. 方法 2: 找规律, 根据模 3 的结果分为 3 种情况

剑指 Offer 14- II. 剪绳子 II - leetcode 剑指 offer 系列

  1. 方法 1: 记忆化搜索, 存当前长度下的最大乘积
  2. 方法 2: 找规律, 根据模 3 的结果分为 3 种情况

剑指 Offer 17. 打印从 1 到最大的 n 位数 - leetcode 剑指 offer 系列

  1. 方法 1: 取上限的下一个数
  2. 方法 2: 利用字符串转换取上限数
  3. 方法 3: 利用循环求上限数

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - leetcode 剑指 offer 系列

  1. 方法 1: 使用额外数组, 双指针一前一后
  2. 方法 2: 双指针原地交换, 向中间靠拢

剑指 Offer 39. 数组中出现次数超过一半的数字 - leetcode 剑指 offer 系列

  • 投票法, 记录当前候选者和票数

剑指 Offer 40. 最小的 k 个数 - leetcode 剑指 offer 系列

  1. 方法 1: 排序后选前 k 个
  2. 方法 2: 快速排序思想
  3. 方法 3: 长度为 k 的最大堆, heapq
  4. 方法 4: 长度为 k 的最大堆, 自定义堆

剑指 Offer 41. 数据流中的中位数 - leetcode 剑指 offer 系列

  1. 方法 1: 左侧最大堆+右侧最小堆, heapq
  2. 方法 2: 左侧最大堆+右侧最小堆, 自定义堆

剑指 Offer 43. 1 ~ n 整数中 1 出现的次数 - leetcode 剑指 offer 系列

  • 十进制逐位处理, 统计当前位上为 1 的数字数目, 左右相乘, 根据和 1 的大小关系分三种情况

剑指 Offer 44. 数字序列中某一位的数字 - leetcode 剑指 offer 系列

  • 找规律, 根据当前数字的位数, 判断 n 所属的范围, 然后进一步定位对应的数字

剑指 Offer 45. 把数组排成最小的数 - leetcode 剑指 offer 系列

  • 自定义排序, str(a)+str(b)<str(b)+str(a)
  • 方法 1: 快排
  • 方法 2: 自定义内置排序, 重写 class 的__lt__, 然后 sorted(key = class)

剑指 Offer 49. 丑数 - leetcode 剑指 offer 系列

  1. 方法 1: 最小堆+集合, 类似 BFS 思路
  2. 方法 2: 三指针, 三个有序序列合并, 等于最小值的指针后移, 保存丑数序列

剑指 Offer 51. 数组中的逆序对 - leetcode 剑指 offer 系列

  • 归并排序思路, 注意逆序对不是+1, 而是加左侧剩余部分

剑指 Offer 53 - I. 在排序数组中查找数字 I - leetcode 剑指 offer 系列

  • 二分查找左右边界

剑指 Offer 53 - II. 0 ~ n-1 中缺失的数字 - leetcode 剑指 offer 系列

  1. 方法 1: 前 n 项和减去当前数组和
  2. 方法 2: 二分查找, 只有两种情况, 注意初始值/循环条件/如何移动

剑指 Offer 57. 和为 s 的两个数字 - leetcode 剑指 offer 系列

  • 双指针一前一后, 向中间靠拢

剑指 Offer 57 - II. 和为 s 的连续正数序列 - leetcode 剑指 offer 系列

  1. 方法 1: 滑动窗口, 维护起点/终点/当前窗口和, 根据窗口和与 target 的关系进行移动, 终点最多只需要到target // 2 + 1
  2. 方法 2: 找规律, 枚举长度 le, 判断 target 能否由该长度的数组求和所得, 注意 le 上限要满足 le * (le + 1) // 2 <= target

剑指 Offer 59 - I. 滑动窗口的最大值 - leetcode 剑指 offer 系列

  • 单调双端队列, 左边存窗口最小值, 右边存窗口最大值, 三部曲(移除左边界=>加入右边界=>加入结果)

剑指 Offer 61. 扑克牌中的顺子 - leetcode 剑指 offer 系列

  • 判断两个条件: 非 0 数是否有重复; 非 0 数的最大最小值差值是否小于 5

剑指 Offer 63. 股票的最大利润 - leetcode 剑指 offer 系列

  • 贪心法, 保存全局最小值, 然后每次都尝试用当前数减去它, 求最大的差值

剑指 Offer 64. 求 1+2+…+n - leetcode 剑指 offer 系列

  1. 方法 1: 递归 + and 的短路特性
  2. 方法 2: 前 n 项和+快速乘法, 二进制移位乘法, 同样利用递归+短路特性

剑指 Offer 66. 构建乘积数组 - leetcode 剑指 offer 系列

  • 左到右+右到左循环, 保存前缀积数组, 然后右到左保存后缀积, 与前一个前缀积相乘即可

字符串

剑指 Offer 05. 替换空格 - leetcode 剑指 offer 系列

  1. 方法 1: split+join
  2. 方法 2: 计算替换后长度, 预分配字符数组, 双指针

剑指 Offer 19. 正则表达式匹配 - leetcode 剑指 offer 系列

  • 记忆化搜索, 传入 s/p 下标判断它们之后的子串能否匹配, 注意*.的特殊处理

剑指 Offer 20. 表示数值的字符串 - leetcode 剑指 offer 系列

  • 分析各种字符(数字/e/+/-/./空格/其他字符), 按照 e 划分为左右两部分

剑指 Offer 38. 字符串的排列 - leetcode 剑指 offer 系列

  • getNext() 找当前字符串字典序的下一个排列, 不断循环直到回到初始字符串
  • getNext()内部逻辑: 找第一个小于后一个字符的字符, 并往后查找大于它且最小的字符进行交换, 后面部分翻转后拼接

剑指 Offer 48. 最长不含重复字符的子字符串 - leetcode 剑指 offer 系列

  • 滑动窗口+当前字符集合, 时刻更新 res

剑指 Offer 50. 第一个只出现一次的字符 - leetcode 剑指 offer 系列

  • 字典记录计数和首次出现的位置, 只需要遍历一遍字符串

剑指 Offer 58 - I. 翻转单词顺序 - leetcode 剑指 offer 系列

  1. 方法 1: split+join
  2. 方法 2: 从右向左遍历, 模拟整个过程

剑指 Offer 58 - II. 左旋转字符串 - leetcode 剑指 offer 系列

  1. 方法 1: 字符串切片
  2. 方法 2: 逐个添加, 先添加右半部分, 再添加左半部分

剑指 Offer 67. 把字符串转换成整数 - leetcode 剑指 offer 系列

  • 分析各种字符(空白字符/数字/正负号/其他字符), 使用 isHeadBlank 和 pos 两个 flag

链表

剑指 Offer 06. 从尾到头打印链表 - leetcode 剑指 offer 系列

  1. 方法 1: 存数组然后反转
  2. 方法 2: 递归, 先调用子节点, 之后再加入结果数组中
  3. 方法 3: 辅助栈存节点, 然后循环 pop 到数组中

剑指 Offer 18. 删除链表的节点 - leetcode 剑指 offer 系列

  • 哨兵节点, pre/cur 双指针, cur 的值等于 val 之后就 pre.next = cur.next 然后 break

剑指 Offer 22. 链表中倒数第 k 个节点 - leetcode 剑指 offer 系列

  1. 方法 1: 存到数组里
  2. 方法 2: 计数然后正向遍历
  3. 方法 3: 快慢指针, 快指针先遍历 k 个然后慢指针从起点开始

剑指 Offer 24. 反转链表 - leetcode 剑指 offer 系列

  1. 方法 1: 迭代, 双指针, 画图模拟, 注意初始化
  2. 方法 2: 递归, 返回头尾
  3. 方法 3: 递归, 只返回头

剑指 Offer 25. 合并两个排序的链表 - leetcode 剑指 offer 系列

  1. 方法 1: 迭代, 双指针, 归并排序, 哨兵节点
  2. 方法 2: 递归, 传入两个节点, 返回归并后的头, 注意递归出口

剑指 Offer 35. 复杂链表的复制 - leetcode 剑指 offer 系列

  • 两次遍历, 第一次遍历得出映射关系, 第二次连接 random 部分

剑指 Offer 52. 两个链表的第一个公共节点 - leetcode 剑指 offer 系列

  • 双指针, 遍历到终点后换成另一个的头继续遍历
  • 注意一定要遍历到空节点之后, 下次再换头, 不然会在没有交点的情况时进入死循环!

栈/队列

剑指 Offer 09. 用两个栈实现队列 - leetcode 剑指 offer 系列

  • stackIn 和 stackOut 栈, deleteHead 优先从 out 栈中 pop, 没有的话再从 in 栈里面倒入 out 栈, 之后再 pop

剑指 Offer 30. 包含 min 函数的栈 - leetcode 剑指 offer 系列

  • 额外单调递减栈, 当前 push 值小于等于单调栈顶时 push, 当前 pop 值等于单调栈顶时 pop

剑指 Offer 31. 栈的压入、弹出序列 - leetcode 剑指 offer 系列

  1. 方法 1: 使用栈模拟, 外层 for 循环 pushed 数组, 内层 while 循环判断栈顶和当前 poped 下标位置
  2. 方法 2: 将 pushed 数组作为栈, 额外记录栈顶下标, 不使用额外空间

剑指 Offer 59 - II. 队列的最大值 - leetcode 剑指 offer 系列

  • 使用两个 deque, 一个存正常的队列, 另一个存单调队列. push 时从一侧循环移除更小值, pop 时如果和最大值相等则从另一侧移除最大值

剑指 Offer 07. 重建二叉树 - leetcode 剑指 offer 系列

  1. 方法 1: 递归, 传入前序/中序起点和终点, 结合{值:中序下标}快速定位根节点的中序下标位置
  2. 方法 2: 迭代, 栈存前面的节点, 分析当前节点在左还是在右

剑指 Offer 26. 树的子结构 - leetcode 剑指 offer 系列

  • 使用额外 match 方法传入当前比较的两个头结点

剑指 Offer 27. 二叉树的镜像 - leetcode 剑指 offer 系列

  1. 方法 1: DFS 递归, 原地修改
  2. 方法 2: BFS 遍历, 无需按层遍历, 原地修改当前 node 的左右节点

剑指 Offer 28. 对称的二叉树 - leetcode 剑指 offer 系列

  1. 方法 1: DFS 递归, 先生成镜像再逐个比较
  2. 方法 2: DFS 递归, 直接按照是否对称比较
  3. 方法 3: BFS 遍历, 存左右两个列表, 需要存空节点

剑指 Offer 32 - I. 从上到下打印二叉树 - leetcode 剑指 offer 系列

  1. 方法 1: Python 列表+for 循环
  2. 方法 2: 双端队列+while 循环

剑指 Offer 32 - II. 从上到下打印二叉树 II - leetcode 剑指 offer 系列

  • 按层 BFS, 记录当前层长度 curlen

剑指 Offer 32 - III. 从上到下打印二叉树 III - leetcode 剑指 offer 系列

  • 按层 BFS+方向 flag

剑指 Offer 33. 二叉搜索树的后序遍历序列 - leetcode 剑指 offer 系列

  1. 方法 1: 递归, 分治法, 快速排序思想
  2. 方法 2: 迭代, 维护单调递增栈+根节点

剑指 Offer 34. 二叉树中和为某一值的路径 - leetcode 剑指 offer 系列

  1. 方法 1: DFS, 传入当前节点/路径/路径和
  2. 方法 2: BFS 存三元组(当前节点, 路径, 路径和)

剑指 Offer 36. 二叉搜索树与双向链表 - leetcode 剑指 offer 系列

  1. 方法 1: 递归分治法, 返回转换后的链表头和尾
  2. 方法 2: 中序遍历, 存 pre 节点, 与当前节点相连

剑指 Offer 37. 序列化二叉树 - leetcode 剑指 offer 系列

  • BFS, 存节点详细信息[当前节点下标, 父节点下标, 父节点指向方向, 节点]

剑指 Offer 54. 二叉搜索树的第 k 大节点 - leetcode 剑指 offer 系列

  • 中序遍历翻转, 先右子树再根再左子树

剑指 Offer 55 - I. 二叉树的深度 - leetcode 剑指 offer 系列

  1. 方法 1: DFS 递归求深度
  2. 方法 2: BFS 求层数

剑指 Offer 55 - II. 平衡二叉树 - leetcode 剑指 offer 系列

  • 递归+全局标记, 边求深度边判断, 返回深度, 全局变量标记当前是否平衡, 不平衡时直接返回 0

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 - leetcode 剑指 offer 系列

  • 根据根节点和 p/q 的值的关系来决定找到/向左/向右

剑指 Offer 68 - II. 二叉树的最近公共祖先 - leetcode 剑指 offer 系列

  1. 方法 1: 递归, 返回 findp 和 findq, 注意祖先只能赋值一次, 这样才是最近的祖先
  2. 方法 2: 迭代, parent 字典+visit 集合, 找到一个在 v 集合的父节点后就直接返回, 这样才是最近祖先

剑指 Offer 12. 矩阵中的路径 - leetcode 剑指 offer 系列

  • DFS, 找有效起点, 记录当前路径, 使用 visit 集合或改变原数组的值来标记已经遍历的点

剑指 Offer 13. 机器人的运动范围 - leetcode 剑指 offer 系列

  1. 方法 1: DFS + visit 集合
  2. 方法 2: BFS + visit 集合
  3. 方法 3: DP, 如果 rc 数位和大于 k, dp[r,c] = False, 否则 dp[r,c] = dp[r-1,c] or dp[r,c-1]

剑指 Offer 29. 顺时针打印矩阵 - leetcode 剑指 offer 系列

  1. 方法 1: 维护当前下标和方向和 visit 集合, 逐个点遍历
  2. 方法 2: 按层遍历, 剥洋葱, 注意可能不存在向左或向上的部分

位运算

剑指 Offer 15. 二进制中 1 的个数 - leetcode 剑指 offer 系列

  1. 方法 1: 转二进制字符串统计
  2. 方法 2: 循环移位统计
  3. 方法 3: n &= n - 1
  4. 方法 4: n -= n & -n

剑指 Offer 16. 数值的整数次方 - leetcode 剑指 offer 系列

  1. 方法 1: 二分分治法递归+记忆化搜索, 分别调用 n//2 和 n-n//2, 注意递归出口
  2. 方法 2: 快速幂, 奇数乘入结果, 偶数不变, 然后幂右移, 数字乘以自身

剑指 Offer 56 - I. 数组中数字出现的次数 - leetcode 剑指 offer 系列

  • 其他数字出现偶数次, 某两个数字各出现奇数次 => 异或后根据异或结果的某个 1 分两类

剑指 Offer 56 - II. 数组中数字出现的次数 II - leetcode 剑指 offer 系列

  • 其他数字出现奇数次, 某个数字出现 1 次 => 按照二进制每一位统计次数, 然后对这个奇数次取模

剑指 Offer 65. 不用加减乘除做加法 - leetcode 剑指 offer 系列

  • 利用 (a&b)<<1 求进位, 利用 a^b 求无进位和, 两者赋值为新的 a 和 b 不断循环, 直到进位为 0 即可, 注意 python 负数的处理

动态规划

剑指 Offer 10- I. 斐波那契数列 - leetcode 剑指 offer 系列

  • 两变量动态规划, 存前两个值, 当前值为它们的和

剑指 Offer 10- II. 青蛙跳台阶问题 - leetcode 剑指 offer 系列

  • 两变量动态规划, 存前两个值, 当前值为它们的和, 与上一题唯一区别是初始化不同

剑指 Offer 42. 连续子数组的最大和 - leetcode 剑指 offer 系列

  • 动态规划+空间优化, dp 存当前数字结尾的最大和, dp = max(dp + x, x)

剑指 Offer 46. 把数字翻译成字符串 - leetcode 剑指 offer 系列

  • 动态规划, dp[i]代表末尾第 i 位时可以翻译的字符串数目, dp[i] = dp[i-2] (使用2个字符) + dp[i-1] (使用1个字符) if 10 <= int(s[i - 1:i + 1]) <= 25 else dp[i-1]

剑指 Offer 47. 礼物的最大价值 - leetcode 剑指 offer 系列

  • 动态规划, dp[r,c]代表格子(r,c)所能获得的最大价值, dp[r,c] = max(dp[r-1,c], dp[r,c-1]) + grid[r][c] (r-1>=0 and c-1>=0)

剑指 Offer 60. n 个骰子的点数 - leetcode 剑指 offer 系列

  • 动态规划+空间优化, dp 存当前骰子数下面的所有可能取值的概率, 推导出骰子数+1 的所有概率

剑指 Offer 62. 圆圈中最后剩下的数字 - leetcode 剑指 offer 系列

  • 动态规划+空间优化, 反推, dp[n, m] = (dp[n-1,m]+m)%n, 遍历[2,n], 注意推导过程

大家可以在下面这些地方找到我~
我的知乎专栏
我的头条号
我的 CSDN
我的 Leetcode
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~

leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列相关推荐

  1. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer

    题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...

  2. leetcode 贪心_利用贪心算法解LeetCode第1253题:重构2行二进制矩阵

    题目描述 给你一个 2 行 n 列的二进制数组:矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1.第 0 行的元素之和为 upper.第 1 行的元素之和为 lower.第 i 列(从 ...

  3. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  4. 最新算法校招编程-剑指offer、Leetcode常考题目及解法分享

    本资源整理了BAT.TMD等互联网算法岗校招面试过程中常考的LeetCode和剑指offer编程题:此外,还整理了部分百度.腾讯.阿里.今日头条相关的面试经验,对于正准备校招面试的同学非常值得参考复习 ...

  5. 每周leetcode - 02链表专题 237/83/234/138/92/142/Offer 22/148/23/24/147/86/61/328/2/Offer06

    文章目录 leetcode - 237. 删除链表中的节点 leetcode - 83. 删除排序链表中的重复元素 leetcode - 234. 回文链表 leetcode - 138. 复制带随机 ...

  6. LeetCode 59 _ Sprial Matrix II 旋转矩阵2

    Description: Given a positive integer n, generate a square matrix filled with elements from 1 to n2  ...

  7. 如何在 LeetCode 高效刷题,才能拿到一线大厂 Offer

    有人说写代码就像我们平时开车,仅凭经验你就可以将车开走:但当有一天,这辆车出问题跑不起来的时候,你不懂汽车的运行机制,你要怎么排除和解决问题?所以拥有扎实的数据结构和算法,才能开好编程这辆车. 作为程 ...

  8. python 在同一行打印_关于打印:Python:在同一行上打印多个

    我想运行一个脚本,它基本上显示如下内容: Installing XXX...               [DONE] 现在,我使用print在函数成功后打印整行.但是,现在我希望它首先打印" ...

  9. 斑马打印机EPL2指令自动打印_配合扫描枪边扫边打

    在斑马便携式打印机中的语言大多是EPL2语言,当然很多机型支持的语言不止一种.在EPL2中可以是先一边扫描条码,一边把扫描到的数据打印出同一个条码出来.也可以扫描若干个条码然后打印出来,还可以设置每次 ...

最新文章

  1. Kubernetes中Service的种类
  2. 趣学python3(9)-range
  3. npm install 报错 :stack Error: Can't find Python executable python
  4. C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
  5. 关于 Mac OS X 内核技术来源
  6. Linux oracle中文乱码的问题解决
  7. 解决关于打开plist文件乱码问题,plist转换为xml文件的txt文件!
  8. Javascript中五种定义对象的方法
  9. 【音视频】WIN8|WIN10的桌面采集技术-DXGI(一)
  10. qq远程控制无法连接服务器,win10系统QQ远程协助,无法控制对方电脑,怎么办?...
  11. Pytorch基础知识(7)单目标检测
  12. git clone与git pull区别
  13. 机器人运动估计——IMU运动方程与ESKF原理介绍(下)
  14. 1050: 平方和与立方和
  15. 慧智预推出更多aiwi独占游戏
  16. Pick-up sticks POJ - 2653
  17. 深入理解Linux内存管理
  18. [MRCTF2020]千层套路1
  19. python3项目开发实例网盘_这些关于宇宙的浪漫句子
  20. 鬼谷子与孙膑、庞涓的故事

热门文章

  1. HTML作业-保护环境-保护地球
  2. java在mysql读取数据库数据库数据_JAVA的JDBC连接数据库以及读取数据库数据
  3. oracle数据库查看归档路径,centos7下查oracle归档及物理文件路径
  4. java xml dom4j 解析_Java使用DOM4J解析XML
  5. java media.player_关于Java:如何正确发布Android MediaPlayer
  6. android webview权限申请_Android WebView 获取定位权限的问题。
  7. python 白色怎么表示_python – 如何使用pil使用白色背景(透明?)的round_corner标识?...
  8. bin文件编辑_为MediaWiki安装可视化编辑器VisualEditor
  9. Qt之格栅布局(QGridLayout)
  10. 自然语言处理简介及开发环境