剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode) 主站3题
思路:
遍历字符串,pos 数组记录当前字符在s中的位置,left 记录当前不重复子串的起点-1,当前不重复子串为i - left。
如果pos数组中有当前字符,且它的位置在left右侧,说明当前的不重复子串出现了重复字符,则更新 left = pos[s[i]]。
(写下思路15min)
剑指 Offer 63. 股票的最大利润 - 力扣(LeetCode) 主站121题
思路:
遍历数组,用 min 记录下截至目前的最小值,v - min 就是今天卖出所能得到的最大利润。res 记录截至目前所能得到的最大利润。
(写下思路5min)
剑指 Offer 07. 重建二叉树 - 力扣(LeetCode) 主站105题
思路:
建立辅助函数build,传入前序和后序序列,以及两个序列的左右边界。
如果左边界>右边界,则返回null。
找到前序序列首元素在中序序列中的位置i。用前序序列首元素建立当前节点。
左子树函数参数:前序序列的左边界变为 pleft+1,右边界为 pleft+i-ileft。
右子树函数参数:前序序列的左边界变为 pleft+i-ileft+1,右边界为 pright。
返回curr。(i-ileft 为左子树元素个数)
(写下思路16min)
剑指 Offer 53 - II. 0~n-1中缺失的数字 - 力扣(LeetCode) 主站无
思路:
缺失数字左侧的所有数字都和自己的下标相等。
二分法处理,如果中间的元素和自己的下标相等,则缺失发生在右侧,否则缺失发生在左侧。(二分法的难点在于边界情况的处理)
(写下思路10min)
剑指 Offer 49. 丑数 - 力扣(LeetCode) 主站264题
思路:
定义数组res记录所有丑数,且放入1。
定义三个下标变量,指向res的首元素。
当res.length
(写下思路14min)
剑指 Offer 65. 不用加减乘除做加法 - 力扣(LeetCode) 主站无
思路:
a & b 得到两数相加时每一位的进位,左移一位存入carry。
a ^ b 得到不包含进位的两数之和,存入a。
令b = carry,b===0时循环结束。
(写下思路10min)
剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(LeetCode) 主站无
思路:
定义辅助函数recur,参数为后序序列postorder,左边界 i,右边界 j。
如果 i >= j,则节点数量 ≤ 1,返回true。
对二叉搜索树的后序遍历序列,根节点为右边界 j。数组左半部分小于postorder[j],右半部分大于postorder[j]。可以据此找到两部分的界限。
若左侧全都小于postorder[j],右侧全都大于postorder[j],即p===j。且左右子树递归成立,返回true。
(写下思路14min)
剑指 Offer 34. 二叉树中和为某一值的路径 主站113题
思路:
定义辅助函数helper,参数为root, targetSum, 当前数组out, 结果数组res。
如果根节点不存在,return。
将根节点的值放入out。
判断根节点的值和当前targetSum是否相等,且当前根节点是否为叶子节点,满足则将out放入res。
然后递归地用helper处理左右子树。
out.pop(),将当前节点弹出。
(写下思路15min)
剑指 Offer 57 - II. 和为s的连续正数序列 主站无
思路:
定义i, j 为正数序列的左右边界,初始值为1。定义sum用于记录滑动窗口的和。
显然左边界的最大值不会超过 target / 2,可以作为循环结束的标志。
当窗口的和小于 target 的时候,窗口的和需要增加,所以要扩大窗口,窗口的右边界向右移动。
当窗口的和大于 target 的时候,窗口的和需要减少,所以要缩小窗口,窗口的左边界向右移动。
当窗口的和恰好等于 target 的时候,我们需要记录此时的结果。
接下来需要找 i+1 开头的序列,所以窗口的左边界要向右移动。
(写下思路11min)
参考:什么是滑动窗口,以及如何用滑动窗口解这道题
剑指 Offer 47. 礼物的最大价值 主站无
思路:
动态规划,每个点的最大值是 f(i,j-1) 和 f(i−1,j) 中的较大值加上当前单元格礼物价值 grid(i,j),转移方程:f(i,j)=max[f(i,j−1), f(i−1,j)]+grid(i,j)。
(写下思路7min)
剑指 Offer 66. 构建乘积数组 主站无
思路:
题目要求不能用除法。定义数组res,第一次循环得到当前元素左侧所有元素的循环。第二次从右到左,将当前元素右侧所有元素的乘积,乘到res数组上。
(写下思路3min)
剑指 Offer 61. 扑克牌中的顺子 主站无
思路:
关键是顺子的判断条件:除joker外,牌组中的最大值减最小值小于5。且除了joker牌,不能有其他重复的牌。
定义set用于检查重复元素,min和max用于记录最小、最大值,遍历过程中跳过joker。最后返回 max - min < 5。
(写下思路7min)
剑指 Offer 44. 数字序列中某一位的数字 主站400题
思路:
规律是前9个数都是1位的,然后 10 到 99 总共 90 个数字都是两位的,100 到 999 这 900 个数都是三位的。
定义变量 len 记录当前循环区间的数字位数,start 记录当前循环区间的第一个数字,cnt 记录当前循环区间的数字个数,start和cnt每次循环*10。
当 n > len * cnt 时循环继续,每次更新n为n - len * cnt。
循环结束后,(n-1)/len 就是目标数字在该区间里的坐标,加上 start 就是得到了目标数字,然后(n-1)%len就是所要求的目标位。
(n-1的原因:当len=3,n为1 2 3时,区间坐标为0,n为4 5 6时,区间坐标为1... (n-1)/len 可以实现这个效果)
(写下思路60min)
参考:[LeetCode] 400. Nth Digit 第N位 - Grandyang
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 主站无
思路:定义i, j指向数组两边,当i
剑指 Offer 32 - II. 从上到下打印二叉树 II 主站无
思路:
如果根节点存在,将其压入队列queue。
定义tmp用来记录每一层的元素,当队列queue不为空时循环。
处理queue中每一个元素,取出一个,压入tmp,将当前元素的左右子树压入queue。最后将tmp中的元素都压入res。
(写下思路12min)
剑指 Offer 54. 二叉搜索树的第k大节点 主站无
思路:
题目可转化为求 “此树的中序遍历倒序的第 k 个节点”。
递归遍历时,若root不存在或k1==0,则返回。
对当前节点,k1--,若k1==0,则更新res。
(写下思路20min)
剑指 Offer 68 - II. 二叉树的最近公共祖先 主站236题
思路:
若当前节点不存在,返回 null。
若当前节点是p或q,返回当前节点。
递归调用当前函数,传入左右子树。
若返回值不为null,则子树中存在p或q。
若左右子树都不为null,返回root。否则返回不为空的节点,或null。
(写下思路11min)
剑指 Offer 32 - III. 从上到下打印二叉树 III 主站无
思路:
队列queue中保存了当前行的所有元素,从左至右。
定义tmp数组,记录当前行的打印。根据res.length决定元素加入tmp数组的方向。
(写下思路5min)
剑指 Offer 52. 两个链表的第一个公共节点 主站160题
思路:
若两个链表无交点,则两者把两个链表循环一遍,最后指向对方链表的末尾。
若有交点,则长链表遍历结束时,短链表指针和长链表指针会从两个链表的同一位置开始,然后相遇。
(写下思路9min)
剑指 Offer 64. 求1+2+…+n 主站无
思路:
用 && 代替 if。
如果n>0,执行&&之后的语句,然后返回n。
否则返回0。
(写下思路5min)
剑指 Offer 28. 对称的二叉树 主站101题
思路:
构造辅助函数,用来判断左右子树是否对称。
若左右子树都为null,返回true。
若左右子树有一个为null,或两者值不相等,返回false。
递归判断子树的子树。
(写下思路6min)
剑指 Offer 31. 栈的压入、弹出序列
思路:
新建一个栈stack,用于模拟栈的压入、弹出过程。
每次入栈后,循环判断 “栈顶元素 == 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。
若 stack 为空,则此弹出序列合法。
(写下思路3min)
704. 二分查找
思路:
最基础的二分查找,关键是边界条件的处理。
左指针指向最左侧有效数据,右指针指向最右侧有效数据的右侧一位。
(写下思路4min)
53. 最大子数组和
思路:
max_ending_here 表示以当前位置作为结束位置的子数组的最大和。
(写下思路4min)