- 博客(25)
- 收藏
- 关注
原创 代码随想录算法训练营第二十九天(回溯5)|491. 非递减子序列、46. 全排列、47. 全排列 II(JAVA)
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:示例 2:提示:跟之前的子集II很像,但是不能用它的去重逻辑,本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。46. 全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:示例 2:示例 3:提示:
2024-04-03 20:53:58
892
原创 代码随想录算法训练营第二十八天(回溯4)|93. 复原 IP 地址、78. 子集、90. 子集 II(JAVA)
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点。求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。返回该数组所有可能的。
2024-04-03 20:44:04
829
原创 代码随想录算法训练营第二十七天(回溯3)|39. 组合总和、40. 组合总和 II、131. 分割回文串(JAVA)
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。如果至少一个数字的被选数量不同,则两种组合是不同的。target从1开始减少了很多麻烦,跟之前组合那道题差不多,没有了选取次数的限制,增加了总和的限制。
2024-04-01 15:27:07
1083
原创 代码随想录算法训练营第二十五天(回溯2)|216. 组合总和 III、17. 电话号码的字母组合(JAVA)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。定义一个map或者二维数组来做字母和数字的映射,循环跟组合那道题一样用回溯法来破解多层循环嵌套。比昨天的77.组合那道题多加了一个限制条件,基本思路差不太多。k是树的宽度,9是树的深度。返回 所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。每个数字 最多使用一次。
2024-03-30 17:47:21
416
原创 代码随想录算法训练营第二十四天(回溯1)|77. 组合(JAVA)
递归来做层叠嵌套(可以理解是开k层for循环),每一次的递归中嵌套一个for循环,那么递归就可以用于解决多层嵌套循环的问题了。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。用回溯法,递归解决嵌套层数的问题来暴力搜索。由于取过的数不再重复取,所以要动态收缩范围。回溯是递归的副产品,本质上是一种穷举。回溯解决的问题可以抽象为一种树形结构。你可以按 任何顺序 返回答案。回溯主要用来解决以下问题。
2024-03-29 17:26:10
487
1
原创 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树(JAVA)
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。所以结果应当返回修剪好的二叉搜索树的新的根节点。节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。
2024-03-29 17:18:29
927
1
原创 代码随想录算法训练营第二十二天(二叉树8)|235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点(JAVA)
返回插入后二叉搜索树的根节点。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。比昨天最后一道题简单一点,二叉搜索树是有序的,所以可以直接从上到下递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。
2024-03-27 09:24:30
822
1
原创 代码随想录算法训练营第二十一天(二叉树VII)| 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先(JAVA)
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。结点左子树中所含节点的值 小于等于 当前节点的值。结点右子树中所含节点的值 大于等于 当前节点的值。
2024-03-26 09:09:34
1020
原创 代码随想录算法训练营第二十天(二叉树VI)| 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树(JAVA)
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。要比较的是:左子树所有节点小于中间节点,右子树所有节点大于中间节点。注意:不能单纯的比较左节点小于中间节点,右节点大于中间节点。
2024-03-25 08:42:07
1122
原创 代码随想录算法训练营第十八天(二叉树V)| 13. 找树左下角的值、112. 路径总和、106. 从中序与后序遍历序列构造二叉树(JAVA)
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。要遍历从根节点到叶子节点的路径看看总和是不是目标和,可以用DFS来做。
2024-03-24 14:39:59
890
1
原创 代码随想录算法训练营第十七天(二叉树IV)| 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和(JAVA)
左叶子节点:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。这个题不适合用层序遍历,因为一个节点是不是左叶子不能根据它来判断,而是要通过它的父节点来判断,所以要用后序。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。后序遍历方便获得递归回来的子树上左叶子的值,也可以用迭代做。递归和回溯结合,用前序遍历方便记录父节点到子节点的路径。给定二叉树的根节点 root ,返回所有左叶子之和。叶子节点 是指没有子节点的节点。
2024-03-22 16:07:37
735
1
原创 代码随想录算法训练营第十六天(二叉树III)| 104. 二叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数(JAVA)
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。和上个题差不多,但是要注意示例二的情况,假如左子树或右子树为空,那么最小深度不是1,要加一层判断。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。输入:root = [1]
2024-03-22 14:57:45
385
1
原创 代码随想录算法训练营第十五天(二叉树II)| 102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树(JAVA)
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。要比较两棵树而不是相邻的两个节点,所以只能用后序遍历做。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。用前序后序都可以,思路差不多,中序会把一些节点反转两次,所以不能用。可以用DFS递归做,也可以用队列实现BFS迭代,主要是判断层次。给你一个二叉树的根节点 root , 检查它是否轴对称。只要逐层深入把同层相邻节点互换就可以。
2024-03-22 10:29:51
415
1
原创 代码随想录算法训练营第十四天(二叉树I)| 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历(JAVA)
递归的方法论还是挺重要的,感觉思路一下子就清晰了不少。迭代看着有点懵,后面一定要弄明白,加油!
2024-03-19 10:22:39
603
1
原创 代码随想录算法训练营第十三天(栈和队列III)| 239. 滑动窗口最大值、347. 前 K 个高频元素(JAVA)
今天的题目真的还挺难的,二刷争取能自己做出来,加油!
2024-03-18 13:10:15
363
1
原创 代码随想录算法训练营第十一天(栈和队列II)| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值(JAVA)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。
2024-03-16 11:26:12
557
1
原创 代码随想录算法训练营第十天(栈和队列I)| 232. 用栈实现队列、225. 用队列实现栈(JAVA)
栈和队列都是很重要的数据结构,具体的实现方法和作用要好好研究。加油!
2024-03-15 11:05:46
1687
1
原创 代码随想录算法训练营第九天(字符串II)| 28. 实现 strStr()、459. 重复的子字符串(JAVA)
KMP一看就会一做就废,今天真的调了好久好久,第二题KMP还是抄了题解才做出来,后续再多刷吧,加油!
2024-03-14 11:14:34
355
1
原创 代码随想录算法训练营第八天(字符串I)| 344.反转字符串、541. 反转字符串 II、54. 替换数字(卡码网)、151. 反转字符串中的单词、55. 右旋字符串(卡码网)(JAVA)
开始学习字符串了,基础还要再巩固一下好多基础函数都用的有点问题。后两道题周末再回来复习一下,调了太久最后还是看了答案才改出来。
2024-03-13 10:42:33
816
1
原创 代码随想录算法训练营第七天(哈希表II)| 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和(JAVA)
今天的题真的有点难,后两道思路还是有点模糊不是太懂,周天重新做一下吧。哈希表学完还是挺有收获的,继续加油!
2024-03-12 20:22:18
755
1
原创 代码随想录算法训练营第六天(哈希表I)| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和(JAVA)
哈希表是一种很经典的用空间换时间的方法,主要用于快速检索某个值是否出现在集合中,避免了检索需要遍历集合的时间消耗。java底层对于set和map的实现原理之类的知识点还是要好好复习一下,继续加油!
2024-03-11 13:16:23
881
1
原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II(JAVA)
今天题目大体上思路都明白,有好几个细节调了好久,什么与或、等不等于之类的,基础还是不太牢,能自己debug出来还是很有成就感的,对双指针的理解又加深了不少。加油!
2024-03-09 14:16:07
1173
原创 代码随想录算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表(JAVA)
开始学链表,之前都是直接调函数,从头实现还是第一次,感觉对链表的理解加深了不少。加油!
2024-03-08 11:13:06
864
原创 代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II(JAVA)
数组算是结束了,双指针法和滑动窗口法掌握的还算可以,循环不变量的思想虽然大概有点概念了但换题还是会先debug很久才发现又踩坑了。分析问题掌控代码的能力还是要多刷题多练啊。不积跬步无以至千里,加油!
2024-03-07 10:34:43
935
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素(JAVA)
代码随想录第一天打卡今天巩固了数组的基础,二分一看就会一敲就废每次都要debug好久,这次总算是把思路跟注意事项理清了。主要学习了双指针法的思想,比暴力省时多了第一天打卡,加油。
2024-03-06 10:38:58
877
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人