注:以下题目均来源于LeetCode
第 1 天 栈与队列(简单)
剑指 Offer 09. 用两个栈实现队列 简单 (栈 设计 队列)
剑指 Offer 30. 包含min函数的栈 简单 (栈 设计) —— 本题与主站 155 题相同
第 2 天 链表(简单)
剑指 Offer 06. 从尾到头打印链表 简单 (栈 递归 链表 双指针)
剑指 Offer 24. 反转链表 简单 (递归 链表) —— 本题与主站 206 题相同 tips:可用next指针实现逆转
剑指 Offer 35. 复杂链表的复制 中等 (哈希表 链表) —— 本题与主站 138 题相同 tips:①先复制再拆分,节省空间;②利用HashMap
第 3 天 字符串(简单)
剑指 Offer 05. 替换空格 字符串 (简单)
剑指 Offer 58 - II. 左旋转字符串 数学 双指针 字符串 (简单)
第 4 天 查找算法(简单)
剑指 Offer 03. 数组中重复的数字 数组 哈希表 排序 (简单) —— 1.借助HashSet;2.双循环暴力求解;3.原地交换,观察条件数值范围为0~n
剑指 Offer 53 - I. 在排序数组中查找数字 I 数组 二分查找 (简单)
剑指 Offer 53 - II. 0~n-1中缺失的数字 位运算 数组 哈希表 数学 二分查找 (简单) —— 1.数学(高斯求和公式); 2.遍历; 3.双指针
第 5 天 查找算法(中等)
剑指 Offer 04. 二维数组中的查找 数组 二分查找 分治 矩阵 (中等) —— 1.二分法;2.右上角,二叉树查找
剑指 Offer 11. 旋转数组的最小数字 数组 二分查找 (简单)
剑指 Offer 50. 第一个只出现一次的字符 队列 哈希表 字符串 计数 (简单) —— 1.哈希表;2.数组
第 6 天 搜索与回溯算法(简单)
剑指 Offer 32 - I. 从上到下打印二叉树 树 广度优先搜索 二叉树 (中等)
剑指 Offer 32 - II. 从上到下打印二叉树 II 树 广度优先搜索 二叉树 (简单) —— 本题与主站 102 题相同 利用queue的当前长度进行本层遍历
剑指 Offer 32 - III. 从上到下打印二叉树 III 树 广度优先搜索 二叉树 (中等) —— 1.双端队列;2.采用倒序Collections.reverse(list)
第 7 天 搜索与回溯算法(简单)
剑指 Offer 26. 树的子结构 树 深度优先搜索 二叉树 (中等) —— 递归
剑指 Offer 27. 二叉树的镜像 树 深度优先搜索 广度优先搜索 二叉树 (简单) —— 1.迭代;2.递归
剑指 Offer 28. 对称的二叉树 树 深度优先搜索 广度优先搜索 二叉树 (简单)
第 8 天 动态规划(简单)
剑指 Offer 10- I. 斐波那契数列 记忆化搜索 数学 动态规划 (简单) —— 1.递归实现动态规划(记忆化搜索,即设置缓存数组);2.递推实现动态规划;3.矩阵幂;4.打表(根据已知的数据范围)
剑指 Offer 10- II. 青蛙跳台阶问题 记忆化搜索 数学 动态规划 (简单) —— 注意:本题与主站 70 题相同 所有方法同上(在动态规划中,状态是跳1或跳2,选择是当前的台阶数0~n)
剑指 Offer 63. 股票的最大利润 数组 动态规划 (中等) —— 注意:本题与主站 121 题相同
第 9 天 动态规划(中等)
剑指 Offer 42. 连续子数组的最大和 数组 分治 动态规划 (简单) —— 注意:本题与主站 53 题相同 —— 动态规划
剑指 Offer 47. 礼物的最大价值 数组 动态规划 矩阵 (中等) —— 动态规划(转移矩阵f(i,j)=max[f(i,j−1),f(i−1,j)]+grid(i,j)
)
第 10 天 动态规划(中等)
剑指 Offer 46. 把数字翻译成字符串 字符串 动态规划 (中等) —— 1.青蛙跳台阶;2.动态规划:状态转移矩阵!若10<=num%100<=25,dp[i]=dp[i-1]+dp[i-2]; 否则dp[i]=dp[i-1]
剑指 Offer 48. 最长不含重复字符的子字符串 哈希表 字符串 滑动窗口 (中等) —— 注意:本题与主站 3 题相同 动态指针×;滑动窗口,用set维护√
第 11 天 双指针(简单)
剑指 Offer 18. 删除链表的节点 链表 (简单)
剑指 Offer 22. 链表中倒数第k个节点 链表 双指针 (简单)
第 12 天 双指针(简单)
剑指 Offer 25. 合并两个排序的链表 递归 链表 (简单) —— 注意:本题与主站 21 题相同
面试题52. 两个链表的第一个公共节点 哈希表 链表 双指针 (简单) —— 本题与主站 160 题相同 浪漫到了!解题:你变成我,走过我走过的路。 我变成你,走过你走过的路。 然后我们便相遇了..
第 13 天 双指针(简单)
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 数组 双指针 排序 (简单)
剑指 Offer 57. 和为s的两个数字 数组 双指针 二分查找 (简单) —— 注意:警惕相加结果溢出,用target-nums[i]==target-nums[j]
代替相加
剑指 Offer 58 - I. 翻转单词顺序 双指针 字符串 (简单) —— 注意:本题与主站 151 题相同 —— 1.strip();split();join()
; 2.strip();split();StringBuilder()
; 3.双指针+StringBuilder();
第 14 天 搜索与回溯算法(中等)
剑指 Offer 12. 矩阵中的路径 数组 回溯 矩阵 (中等)—— 注意:本题与主站 79 题相同 —— 搜索回溯法(递归),看labuladong算法笔记
剑指 Offer 13. 机器人的运动范围 深度优先搜索 广度优先搜索 动态规划 (中等)
第 15 天 搜索与回溯算法(中等)
剑指 Offer 34. 二叉树中和为某一值的路径 树 深度优先搜索 回溯 二叉树 (中等) —— 注意:本题与主站 113 题相同 DFS回溯搜索(我做出来啦还写了题解):可以不用Collections.copy(),大佬用res.add(new ArrayList(path))
剑指 Offer 36. 二叉搜索树与双向链表 栈 树 深度优先搜索 二叉搜索树 链表 二叉树 双向链表 (中等) —— 注意:本题与主站 426 题相同 知道中序遍历,但具体咋整T_T(全局变量,prev和head)
剑指 Offer 54. 二叉搜索树的第k大节点 树 深度优先搜索 二叉搜索树 二叉树 (简单) —— ”简单题我重拳出击“,右根左遍历,用类变量来维护k和res(终于有一次能和大佬的代码一样了)
第 16 天 排序(简单)
剑指 Offer 45. 把数组排成最小的数 贪心 字符串 排序 (中等) —— 排序判断规则:若x+y<y+x
,则x<y
(Arrays.sort(strings,(a,b)->(a+b).compareTo(b+a));
)
剑指 Offer 61. 扑克牌中的顺子 数组 排序 (简单) —— 1.我的:排序+判断num[i]+1==num[i+1]
; 2.大佬:借助set+遍历:判断是否max-min<5
; 3.大佬的方法:排序+遍历:结合max-min<5
判断
第 17 天 排序(中等)
剑指 Offer 40. 最小的k个数 数组 分治 快速选择 排序 堆(优先队列)(简单) —— 快排;堆;计数排序(只冒泡k个)
剑指 Offer 41. 数据流中的中位数 设计 双指针 数据流 排序 堆(优先队列)(困难) —— 注意:本题与主站 295 题相同 1.大佬的方法:大顶堆+小顶堆(K神yyds);2.ArrayList+二分法查找插入新数据
第 18 天 搜索与回溯算法(中等)
剑指 Offer 55 - I. 二叉树的深度 树 深度优先搜索 广度优先搜索 二叉树 (简单) —— 注意:本题与主站 104 题相同 —— 1.我的DFS类变量+先序遍历模板;2.大佬的DFS后序遍历(一行代码解决);3.BFS层序遍历(两个队列,queue遍历,tmp计层节点,queue=tmp)
剑指 Offer 55 - II. 平衡二叉树 树 深度优先搜索 二叉树 (简单) —— 注意:本题与主站 110 题相同 —— 1.DFS自动向下,简单易懂,复杂度高;2.DFS自底向上,后序遍历+剪枝(递归函数返回-1或深度,如果为-1,则剪枝)
第 19 天 搜索与回溯算法(中等)
剑指 Offer 64. 求1+2+…+n 位运算 递归 脑筋急转弯 (中等) —— 借助逻辑符短路n>1 && (n+=sumNums(n-1))>0;
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 树 深度优先搜索 二叉搜索树 二叉树 (简单) —— 注意:本题与主站 235 题相同 迭代;递归(利用二叉搜索树的特性;二叉树最近公共祖先的通用方法)
剑指 Offer 68 - II. 二叉树的最近公共祖先 树 深度优先搜索 二叉树 (简单) —— 注意:本题与主站 236 题相同 递归(前序遍历)
第 20 天 分治算法(中等)
剑指 Offer 07. 重建二叉树 树 数组 哈希表 分治 二叉树 (中等) —— 注意:本题与主站 105 题重复K神递归:a.无重复节点,用HashMap存储中序的val和index;b.借助4个指针root(1个指向前序),i,left,right(3个指向中序),前序遍历:根root,左根root+1,右根root+i-left+1,中序遍历:左子树是lefti-1,右子树是i+1right
剑指 Offer 16. 数值的整数次方 递归 数学 (中等) ——注意:本题与主站 50 题相同快速幂(二分法角度):1.迭代;2.递归(注:int范围为-21474836482147483647)m-1,右子树m~j-1,m是查找出来的,比根大的那个为右子树的根。2.辅助单调性栈(没细看)
剑指 Offer 33. 二叉搜索树的后序遍历序列 栈 树 二叉搜索树 递归 二叉树 单调栈 (中等) —— 1.递归:设置两指针i,j,来定位左右子树的范围,左子树i
第 21 天 位运算(简单)
剑指 Offer 15. 二进制中1的个数 位运算 (简单) —— 注意:本题与主站 191 题相同 1.逐位判断;2.巧用n&(n−1)
;3.内置函数Integer.bitCount()
剑指 Offer 65. 不用加减乘除做加法 位运算 数学 (简单) —— 位运算:int c=(a&b)<<1; //进位 a=a^b; //不进位相加
【记忆】
第 22 天 位运算(中等)
剑指 Offer 56 - I. 数组中数字出现的次数 位运算 数组 (中等)——借助Set:空间复杂度不为O(1);分组异或【膜拜大佬】;排序后遍历(时间复杂度不符合O(n))
剑指 Offer 56 - II. 数组中数字出现的次数 II 位运算 数组 (中等)——1.借助HashMap;2.对每位数字求和取余(%3),余数构成落单的数;3.有限状态机(看不懂..)
第 23 天 数学(简单)
剑指 Offer 39. 数组中出现次数超过一半的数字 数组 哈希表 分治 计数 排序 (简单)—— 注意:本题与主站 169 题相同相同数超过一半:1.HashMap;2.排序后的中位数;3.摩尔投票
剑指 Offer 66. 构建乘积数组 数组 前缀和 (中等) —— 前缀和,正序;倒序,每次到i前一个或后一个就停止,即跳过i
第 24 天 数学(中等)
剑指 Offer 14- I. 剪绳子 数学 动态规划 (中等)—— 注意:本题与主站 343 题相同——1.数学推导:当所有绳段长度相等时乘积最大,最优的绳段长度为3;2.动态规划——内核也是贪心;3.贪心算法
剑指 Offer 57 - II. 和为s的连续正数序列 数学 双指针 枚举(简单)——1.滑动窗口:双指针ArrayList<int[]> list; return list.toArray(new int[0][])
剑指 Offer 62. 圆圈中最后剩下的数字 递归 数学(简单)——1.ArrayListidx=(idx+m-1)%n;
;2.数学公式推导(ans+m)%i
(动态规划,反推活下来的那个人的初始位置)
第 25 天 模拟(中等)
剑指 Offer 29. 顺时针打印矩阵 数组 矩阵 模拟 (简单)——注意:本题与主站 54 题相同遍历:设置四个指针作为边界
剑指 Offer 31. 栈的压入、弹出序列 栈 数组 模拟 (中等)——注意:本题与主站 946 题相同模拟入栈出栈
第 1 天
1480. 一维数组的动态和 数组 前缀和 (简单)
724. 寻找数组的中心下标 数组 前缀和 (简单)
第 2 天
205. 同构字符串 哈希表 字符串 (简单)
392. 判断子序列 双指针 字符串 动态规划 (简单)
第 3 天
21. 合并两个有序链表 递归 链表 (简单)
206. 反转链表 递归 链表 (简单)
第 4 天
876. 链表的中间结点 链表 双指针 (简单) —— 1.ListNode列表;2.遍历两次列表(全遍历+半遍历);3.快慢指针
142. 环形链表 II 哈希表 链表 双指针 (中等) —— 1.HashMap或HashSet; 2.两次双指针(快慢指针)
第 5 天
121. 买卖股票的最佳时机 数组 动态规划 (简单) —— 股票问题|动态规划;单层遍历
409. 最长回文串 贪心 哈希表 字符串 (简单) —— 1.数组,char c;count[c]++; //128个ASCII
2.哈希表
第 6 天
589. N 叉树的前序遍历 栈 树 深度优先搜索 (简单) —— 1.递归法系列:一套拳法👊刷掉n个遍历树的问题;2.迭代(栈)
102. 二叉树的层序遍历 树 广度优先搜索 二叉树 (中等) —— BFS 的使用场景总结:层序遍历、最短路径问题
第 7 天
704. 二分查找 数组 二分查找 (简单) —— 二分法细节详解
278. 第一个错误的版本 二分查找 交互 (简单) —— 二分法细节while(left<right); right=mid; left=mid+1; 最后判定条件是left==right
第 8 天
98. 验证二叉搜索树 树 深度优先搜索 二叉搜索树 二叉树 (中等) —— 1.(递归/非递归)中序遍历结果为递增;2.递归设置边界值(最大值、最小值)
235. 二叉搜索树的最近公共祖先 树 深度优先搜索 二叉搜索树 二叉树 (简单) —— 利用二叉搜索树的特性(递归/迭代)(root.val-p.val)*(root.val-q.val)<=0 // 替代比较
第 9 天 (Both)
733. 图像渲染 深度优先搜索 广度优先搜索 数组 矩阵 (简单)
200. 岛屿数量 深度优先搜索 广度优先搜索 并查集 数组 矩阵 (中等) —— 岛屿类问题的通用解法、DFS 遍历框架
第 10 天
509. 斐波那契数 递归 记忆化搜索 数学 动态规划 (简单)—— 动态规划套路详解
70. 爬楼梯 记忆化搜索 数学 动态规划 (简单)
第 11 天
746. 使用最小花费爬楼梯 数组 动态规划 (简单) —— 写了个题解
62. 不同路径 数学 动态规划 组合数学 (中等) —— 数学排列组合;动态规划dp[i,j]=dp[i,j-1]+dp[i-1,j]
,空间优化,二维dp变一维(逐行更替)
第 12 天
438. 找到字符串中所有字母异位词 哈希表 字符串 滑动窗口 (中等) —— 借助数组的滑动窗口
424. 替换后的最长重复字符 哈希表 字符串 滑动窗口 (中等) —— 借助数组的滑动窗口:sarr[s.charAt(left) - 'A']--;left++;
第 13 天
1. 两数之和 数组 哈希表 (简单) —— 1.借助map,因为需要下标,不然采用set即可;
299. 猜数字游戏 哈希表 字符串 计数 (中等) —— 借助两个数组,遍历两次,公牛数和奶牛数分开计算
第 14 天
844. 比较含退格的字符串 栈 双指针 字符串 模拟 (简单) —— 1.匹配(消除)问题是栈/队列的强项;2.双指针(思路好理解,编码不简单)
394. 字符串解码 栈 递归 字符串 (中等) —— 1.栈:思路理解,编码难;2.递归
第 15 天
1046. 最后一块石头的重量 数组 堆(优先队列)(简单) —— 大顶堆:PriorityQueue<Integer> heap=new PriorityQueue<>((a,b)->b-a);
692. 前K个高频单词 字典树 哈希表 字符串 桶排序 计数 排序 堆(优先队列) (中等) —— 1.java:小顶堆+哈希表+栈【记】; 2.用python词频统计sorted(d,key=lambda k:(-d[k],k))[:k]