lecode
文章平均质量分 54
wcx717
这个作者很懒,什么都没留下…
展开
-
单调栈问题
单调栈原创 2022-08-23 22:31:08 · 338 阅读 · 0 评论 -
子序列问题
子序列问题原创 2022-08-17 11:51:49 · 157 阅读 · 0 评论 -
股票问题合集
股票问题原创 2022-08-03 20:46:51 · 349 阅读 · 0 评论 -
背包问题
背包原创 2022-07-24 18:21:54 · 108 阅读 · 0 评论 -
332. 重新安排行程
方法一:Hierholzer算法,欧拉路径方法二:DFS、回溯原创 2022-06-09 15:53:35 · 135 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数
字符串转换成整数原创 2022-06-06 16:17:27 · 68 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
方法一:数学推导/贪心思想解题思路:切分规则:算法流程:方法二:动态规划解题思路:方法三:递归回溯原创 2022-06-06 16:16:02 · 83 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
方法一:后序遍历+剪枝算法流程:函数:函数:方法二:先序遍历+判断深度算法流程:函数: 判断树 是否平衡函数:计算树的深度原创 2022-06-02 18:45:51 · 72 阅读 · 0 评论 -
47. 全排列 II
递归回溯+剪枝去重思路:树层上去重:树枝上去重:原创 2022-06-02 18:44:42 · 76 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
方法一:递归回溯+交换去重算法解析:方法二:递归回溯+排序去重原创 2022-06-01 21:05:54 · 75 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
二叉树原创 2022-06-01 21:04:44 · 77 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
解题思路:Deque:双向队列和Queue:单向队列继承顺序:Collection --> Queue --> Deque Deque相关API:add(E e) ,将指定的元素插入此双端队列的尾部,空间不足抛出异常addFirst(E e) ,插入此双端队列的前面addLast(E e) ,插入此双端队列的尾部offer(E e) ,将指定的元素插入deque的尾部,空间不足返回falseofferFirst(E e) ,在此deque的前面插入指定的元素o原创 2022-05-31 10:24:55 · 57 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
方法一:层序遍历+双端队列利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:奇数层 则添加至 tmp 尾部偶数层 则添加至 tmp 头部算法流程:特例处理: 当树的根节点为空,则直接返回空列表 [] ;初始化: 打印结果空列表 res ,包含根节点的双端队列 deque ;BFS 循环: 当 deque 为空时跳出; 1. 新建列表 tmp ,用于临时存储当前层打印结果; 2. 当前层打印循环: 循环次数为当前层节点数(即 dequ.原创 2022-05-31 10:23:01 · 118 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
解题思路:若树 BBB 是树 AAA 的子结构,则子结构的根节点可能为树 AAA的任意一个节点。因此,判断树BBB是否是树AAA的子结构,需完成以下两步工作:先序遍历树 AAA 中的每个节点 nAn_AnA;(对应函数isSubStructure(A, B))判断树 AAA 中 以nAn_AnA为根节点的子树 是否包含树 BBB。(对应函数recur(A, B))算法流程:名词规定:**树 AAA**的根节点记作 节点 AAA,树BBB 的根节点称为 节点BBBrecur(A, B原创 2022-05-26 17:12:54 · 65 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配
解题思路:设 sss 的长度为nnn , ppp 的长度为 mmm ;将 sss 的第 iii 个字符记为 sis_isi,ppp 的第 jjj个字符记为 pjp_jpj,将 sss 的前 iii 个字符组成的子字符串记为 s[:i]s[:i]s[:i] , 同理将ppp 的前 jjj 个字符组成的子字符串记为 p[:j]p[:j]p[:j] 。因此,本题可转化为求 s[:n]s[:n]s[:n]是否能和 p[:m]p[:m]p[:m] 匹配。状态数组: 设二维数组dp[m + 1][n +原创 2022-05-26 17:11:34 · 94 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
大数打印法表示大数的变量类型:无论是 short / int / long … 任意变量类型,数字的取值范围都是有限的。因此,大数的表示应用字符串 String 类型生成数字的字符串集使用 int 类型时,每轮可通过 +1 生成下个数字,而此方法无法应用至 String 类型。并且, String 类型的数字的进位操作效率较低,例如 "9999" 至 "10000" 需要从个位到千位循环判断,进位 4 次。观察可知,生成的列表实际上是 nnn 位 0−90 - 90−9的 全排列原创 2022-05-25 15:30:44 · 74 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
解题思路:先序遍历: 按照根、左、右遍历所有节点。路径记录: 各节点值之和等于目标值target时,加入结果列表。算法流程:pathSum(root, sum) 函数:初始化: 结果列表 res ,路径列表 tmp。返回值: 返回 res即可。dfs(root, target) 函数:递推参数: 当前节点 root ,当前目标值 target 。终止条件: 若节点 root 为空,则直接返回。递推工作:路径更新: 将当前节点值 root.val 加入路径 tmp ;原创 2022-05-25 15:28:23 · 57 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
解题思路:中序遍历为递增序列。算法流程:inorder(cur): 递归法中序遍历终止条件: 当节点 cur 为空,代表越过叶节点,直接返回;递归左子树,即 inorder(cur.left) ;构建链表:当 pre 为空时: 代表正在访问链表头节点,记为 head ;当 pre 不为空时: 修改双向节点引用,即 pre.right = cur , cur.left = pre ;保存 cur : 更新 pre = cur ,即节点 cur 是后继节点的 pre ;递归右子树原创 2022-05-24 19:49:48 · 56 阅读 · 0 评论 -
剑指 Offer 49. 丑数
解题思路:丑数的递推性质: 丑数只包含因子2,3,5,因此有”丑数 = 某较小的丑数 ×\times× 某因子(2,3,5)“。设已知长度为 nnn的丑数序列 x1,x2,⋯ ,xnx_1, x_2, \cdots , x_nx1,x2,⋯,xn ,求第 n+1n+1n+1 个丑数 xn+1x_{n+1}xn+1。根根据递推性质,丑数 xn+1x_{n+1}xn+1 只可能是以下三种情况其中之一(索引 a,b,ca, b, ca,b,c 为未知数):xn+1={xa×2xb×3xc×5原创 2022-05-24 19:45:56 · 70 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数
动态规划:设输入nnn 个骰子的解(即概率列表)为 f(n)f(n)f(n) ,其中「点数和」 xxx的概率为 f(n,x)f(n, x)f(n,x)假设已知 n−1n - 1n−1 个骰子的解 f(n−1)f(n - 1)f(n−1) ,此时添加一枚骰子,求 nnn 个骰子的点数和为 xxx 的概率 f(n,x)f(n, x)f(n,x) 。当添加骰子的点数为 1 时,前 n−1n - 1n−1 个骰子的点数和应为 x−1x - 1x−1 ,方可组成点数和 xxx ;以此类推,直至此骰子点数为原创 2022-05-23 12:11:52 · 144 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
解题思路:将 101112⋯101112 \cdots101112⋯ 中的每一位称为 数位 ,记为 nnn ;将 10,11,12,⋯10, 11, 12, \cdots10,11,12,⋯ 称为 数字 ,记为 numnumnum ;数字 101010 是一个两位数,称此数字的 位数 为 222,记为 digitdigitdigit;每 digitdigitdigit 位数的起始数字(即:1,10,100,⋯1, 10, 100, \cdots1,10,100,⋯),记为 startstartst原创 2022-05-23 12:10:15 · 80 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
解题思路:前序遍历:[根节点|左子树|右子树]中序遍历:[左子树|根节点|右子树]分治算法解析:递推参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right ;终止条件: 当 left > right ,代表已经越过叶节点,此时返回 nullnullnull ;递推工作:建立根节点root: 节点值为 preorder[root] ;划分左右子树: 查找根节点在中序遍历 inorder 中的索引 index原创 2022-05-23 10:46:30 · 106 阅读 · 0 评论 -
257. 二叉树的所有路径
方法一:DFS递归如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList();原创 2022-05-19 16:31:59 · 71 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
方法一:后序遍历+剪枝算法流程:recur(root) 函数:返回值:当节点root 左 / 右子树的深度差 ≤ 1 :则返回当前子树的深度,即节点 root 的左 / 右子树的深度最大值 +1 ( max(left, right) + 1 );当节点root左 / 右子树的深度差 > 2 :则返回 -1 ,代表此子树不是平衡树 。终止条件:当 root为空:说明越过叶节点,因此返回高度 0 ;当左(右)子树深度为 −1 :代表此树的 左(右)子树 不是平衡树,因此剪枝,直接返回 −原创 2022-05-19 15:23:15 · 139 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
剑指51:数组中的逆序对方法一:归并排序模板private static void mergeSort(int[] q, int l, int r) { if (l >= r) return; // 确定分界点 int mid = (l + r) >> 1; // 递归左右 mergeSort(q, l, mid); mergeSort(q, mid + 1, r);原创 2022-05-19 14:38:46 · 98 阅读 · 1 评论 -
222:完全二叉树的节点个数
方法一:迭代class Solution { public int countNodes(TreeNode root) { if (root == null) { return 0; } return countNodes(root.left) + countNodes(root.right) + 1; }}方法二:层序遍历二叉树class Solution { public int countNode原创 2022-05-19 15:10:07 · 90 阅读 · 0 评论