剑指 Offer 系列完结撒花!! 🎉🎉

本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考

总的来说, 写这个系列耗费了我不少精力, 不过我也很开心能和大家分享, 真心希望能对大家有所帮助, 也希望大家能够多多点赞转发和分享, 让更多人看到, 谢谢~

接下来我需要休整一段时间来准备新的系列了, 中间也可能会有一些不定期更新. 至于新系列是什么呢? 大家敬请期待 😝

P.S. 公众号即将改名为 算法精选, 更简短和好记, 并且新加了一个暗号 剑指总结. 进入公众号 算法精选, 在聊天框中回复 剑指总结 就能快速定位到这篇文章啦~

目录

  • 数字/数组
    • 剑指 Offer 03. 数组中重复的数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 04. 二维数组中的查找 - leetcode 剑指 offer 系列
    • 剑指 Offer 11. 旋转数组的最小数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 14- I. 剪绳子 - leetcode 剑指 offer 系列
    • 剑指 Offer 14- II. 剪绳子 II - leetcode 剑指 offer 系列
    • 剑指 Offer 17. 打印从 1 到最大的 n 位数 - leetcode 剑指 offer 系列
    • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - leetcode 剑指 offer 系列
    • 剑指 Offer 39. 数组中出现次数超过一半的数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 40. 最小的 k 个数 - leetcode 剑指 offer 系列
    • 剑指 Offer 41. 数据流中的中位数 - leetcode 剑指 offer 系列
    • 剑指 Offer 43. 1 ~ n 整数中 1 出现的次数 - leetcode 剑指 offer 系列
    • 剑指 Offer 44. 数字序列中某一位的数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 45. 把数组排成最小的数 - leetcode 剑指 offer 系列
    • 剑指 Offer 49. 丑数 - leetcode 剑指 offer 系列
    • 剑指 Offer 51. 数组中的逆序对 - leetcode 剑指 offer 系列
    • 剑指 Offer 53 - I. 在排序数组中查找数字 I - leetcode 剑指 offer 系列
    • 剑指 Offer 53 - II. 0 ~ n-1 中缺失的数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 57. 和为 s 的两个数字 - leetcode 剑指 offer 系列
    • 剑指 Offer 57 - II. 和为 s 的连续正数序列 - leetcode 剑指 offer 系列
    • 剑指 Offer 59 - I. 滑动窗口的最大值 - leetcode 剑指 offer 系列
    • 剑指 Offer 61. 扑克牌中的顺子 - leetcode 剑指 offer 系列
    • 剑指 Offer 63. 股票的最大利润 - leetcode 剑指 offer 系列
    • 剑指 Offer 64. 求 1+2+…+n - leetcode 剑指 offer 系列
    • 剑指 Offer 66. 构建乘积数组 - leetcode 剑指 offer 系列
  • 字符串
    • 剑指 Offer 05. 替换空格 - leetcode 剑指 offer 系列
    • 剑指 Offer 19. 正则表达式匹配 - leetcode 剑指 offer 系列
    • 剑指 Offer 20. 表示数值的字符串 - leetcode 剑指 offer 系列
    • 剑指 Offer 38. 字符串的排列 - leetcode 剑指 offer 系列
    • 剑指 Offer 48. 最长不含重复字符的子字符串 - leetcode 剑指 offer 系列
    • 剑指 Offer 50. 第一个只出现一次的字符 - leetcode 剑指 offer 系列
    • 剑指 Offer 58 - I. 翻转单词顺序 - leetcode 剑指 offer 系列
    • 剑指 Offer 58 - II. 左旋转字符串 - leetcode 剑指 offer 系列
    • 剑指 Offer 67. 把字符串转换成整数 - leetcode 剑指 offer 系列
  • 链表
    • 剑指 Offer 06. 从尾到头打印链表 - leetcode 剑指 offer 系列
    • 剑指 Offer 18. 删除链表的节点 - leetcode 剑指 offer 系列
    • 剑指 Offer 22. 链表中倒数第 k 个节点 - leetcode 剑指 offer 系列
    • 剑指 Offer 24. 反转链表 - leetcode 剑指 offer 系列
    • 剑指 Offer 25. 合并两个排序的链表 - leetcode 剑指 offer 系列
    • 剑指 Offer 35. 复杂链表的复制 - leetcode 剑指 offer 系列
    • 剑指 Offer 52. 两个链表的第一个公共节点 - leetcode 剑指 offer 系列
  • 栈/队列
    • 剑指 Offer 09. 用两个栈实现队列 - leetcode 剑指 offer 系列
    • 剑指 Offer 30. 包含 min 函数的栈 - leetcode 剑指 offer 系列
    • 剑指 Offer 31. 栈的压入、弹出序列 - leetcode 剑指 offer 系列
    • 剑指 Offer 59 - II. 队列的最大值 - leetcode 剑指 offer 系列
    • 剑指 Offer 07. 重建二叉树 - leetcode 剑指 offer 系列
    • 剑指 Offer 26. 树的子结构 - leetcode 剑指 offer 系列
    • 剑指 Offer 27. 二叉树的镜像 - leetcode 剑指 offer 系列
    • 剑指 Offer 28. 对称的二叉树 - leetcode 剑指 offer 系列
    • 剑指 Offer 32 - I. 从上到下打印二叉树 - leetcode 剑指 offer 系列
    • 剑指 Offer 32 - II. 从上到下打印二叉树 II - leetcode 剑指 offer 系列
    • 剑指 Offer 32 - III. 从上到下打印二叉树 III - leetcode 剑指 offer 系列
    • 剑指 Offer 33. 二叉搜索树的后序遍历序列 - leetcode 剑指 offer 系列
    • 剑指 Offer 34. 二叉树中和为某一值的路径 - leetcode 剑指 offer 系列
    • 剑指 Offer 36. 二叉搜索树与双向链表 - leetcode 剑指 offer 系列
    • 剑指 Offer 37. 序列化二叉树 - leetcode 剑指 offer 系列
    • 剑指 Offer 54. 二叉搜索树的第 k 大节点 - leetcode 剑指 offer 系列
    • 剑指 Offer 55 - I. 二叉树的深度 - leetcode 剑指 offer 系列
    • 剑指 Offer 55 - II. 平衡二叉树 - leetcode 剑指 offer 系列
    • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 - leetcode 剑指 offer 系列
    • 剑指 Offer 68 - II. 二叉树的最近公共祖先 - leetcode 剑指 offer 系列
    • 剑指 Offer 12. 矩阵中的路径 - leetcode 剑指 offer 系列
    • 剑指 Offer 13. 机器人的运动范围 - leetcode 剑指 offer 系列
    • 剑指 Offer 29. 顺时针打印矩阵 - leetcode 剑指 offer 系列
  • 位运算
    • 剑指 Offer 15. 二进制中 1 的个数 - leetcode 剑指 offer 系列
    • 剑指 Offer 16. 数值的整数次方 - leetcode 剑指 offer 系列
    • 剑指 Offer 56 - I. 数组中数字出现的次数 - leetcode 剑指 offer 系列
    • 剑指 Offer 56 - II. 数组中数字出现的次数 II - leetcode 剑指 offer 系列
    • 剑指 Offer 65. 不用加减乘除做加法 - leetcode 剑指 offer 系列
  • 动态规划
    • 剑指 Offer 10- I. 斐波那契数列 - leetcode 剑指 offer 系列
    • 剑指 Offer 10- II. 青蛙跳台阶问题 - leetcode 剑指 offer 系列
    • 剑指 Offer 42. 连续子数组的最大和 - leetcode 剑指 offer 系列
    • 剑指 Offer 46. 把数字翻译成字符串 - leetcode 剑指 offer 系列
    • 剑指 Offer 47. 礼物的最大价值 - leetcode 剑指 offer 系列
    • 剑指 Offer 60. n 个骰子的点数 - leetcode 剑指 offer 系列
    • 剑指 Offer 62. 圆圈中最后剩下的数字 - leetcode 剑指 offer 系列

数字/数组

剑指 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. 方法 1: 快排
    2. 方法 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

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我