- 博客(41)
- 收藏
- 关注
原创 算法刷题总结
环形链表 🟢环形链表 II 🟠相交链表 🟢删除链表的倒数第 N 个结点 🟠合并两个有序链表 🟢合并K个升序链表 🔴分隔链表 🟠链表的中间结点🟢剑指 Offer 22. 链表中倒数第k个节点 🟢剑指 Offer 25. 合并两个排序的链表 🟢剑指 Offer 52. 两个链表的第一个公共节点 🟢剑指 Offer II 021. 删除链表的倒数第 n 个结点 🟠剑指 Offer II 022. 链表中环的入口节点 🟠剑指 Offer II 023. 两个链表的第
2023-07-13 12:54:32 342
原创 day36 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
具体实现时,我们可以先将区间按照右端点从小到大排序,然后从前往后遍历,每次选择右端点最小的区间,然后将其右端点与后面的区间进行比较,如果有重叠,则删除右端点较大的那个区间。然后再遍历一遍字符串,记录当前区间的起始位置和结束位置,如果当前位置的字母最后出现的位置在当前区间内,则将当前区间扩展到该位置,否则将当前区间结束,并开启下一个区间。解题思路:同样是一道经典的区间问题,我们可以先将所有区间按照左端点从小到大排序,然后从前往后遍历,每次将当前区间与下一个区间进行比较,如果有重叠,则合并两个区间。
2023-04-04 16:34:08 179
原创 day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
Java代码实现中,我们使用了Arrays.sort方法来对气球进行排序,然后使用一个变量cnt来记录我们需要射出的箭的数量,使用一个变量end来记录当前箭的射出位置。对于每一个气球,我们可以根据它的结束坐标来进行排序,然后从左到右遍历所有的气球,如果当前气球的开始坐标在之前的气球的结束坐标之后,则我们需要再射一支箭。我们可以按照每个气球的结束坐标进行排序,然后从左到右遍历一遍所有的气球,如果当前气球的开始坐标在之前的气球的结束坐标之后,则我们需要再射一支箭。如果顾客支付10美元,我们需要找零5美元。
2023-04-04 16:29:58 199
原创 day34 ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
因此,我们可以将起点设为下一个加油站,同时将剩余油量清零,重新开始计算剩余油量。解题思路:根据题目要求,相邻的孩子评分高的必须获得更多的糖果,因此我们可以先将所有孩子的糖果数量都设为 1,然后从左往右遍历一遍数组,如果当前孩子的评分比前一个孩子高,就将其糖果数量设为前一个孩子的糖果数量加一。题目描述:给定一个环形的公路上有 N 个加油站,第 i 个加油站的油量是 gas[i],从第 i 个加油站到第 i+1 个加油站需要消耗 cost[i] 的油量,求从哪个加油站出发可以绕一圈回到该加油站。
2023-04-04 16:28:11 184
原创 day33 贪心总结
需要注意的是,贪心算法并不是万能的,它只适用于一部分问题,而对于其他问题可能需要采用其他算法思想。此外,在实现贪心算法时,需要注意算法的正确性和效率,并且要充分考虑问题的特点,避免盲目使用贪心算法。确定贪心策略:根据问题的特点,确定贪心策略,即在每一步选择中都选择当前状态下最优的选择。证明贪心策略的正确性:贪心策略的正确性需要证明。通常可以采用数学归纳法、反证法等方法进行证明。构造贪心算法:将贪心策略转化为算法实现,通常需要确定数据结构和算法流程。分析时间复杂度:分析算法的时间复杂度,确定算法的运行效率。
2023-04-04 16:24:38 56
原创 day32 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
● 122.买卖股票的最佳时机II● 55. 跳跃游戏● 45.跳跃游戏II贪心算法是一种基于贪心策略的算法,在解决某些问题时非常有效。其基本思路是局部最优解能导致全局最优解。在这篇报告中,我们将使用贪心算法解决三个问题:122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II。我们将使用Java编写代码。
2023-04-04 16:19:01 327
原创 day31 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
贪心思路:从序列的第一个数开始,判断当前数与下一个数之间的差的正负性。贪心思路:从序列的第一个数开始,依次将每个数加到当前的子序列中,并记录当前子序列的最大值和当前子序列的和。如果当前子序列的和小于0,则说明当前子序列已经不可能是最大的连续子序列了,需要重新开始寻找从下一个数开始的子序列。通过这样的方式,每次找到一个最大的连续子序列的和,最终就能得到整个序列中的最大子序和。贪心思路:首先将孩子的贪心因子g和饼干的大小s从小到大排序,然后从贪心因子最小的孩子开始,依次判断每个孩子是否能够获得一块饼干。
2023-04-04 16:13:28 302
原创 day30 ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独
● 332.重新安排行程● 51. N皇后● 37. 解数独这三道题之后,请写一个详细的技术报告。代码用Java。题目背景本次报告是对三道经典的算法问题进行解决的一个技术总结。在解决这些问题的过程中,我们使用了Java语言进行编码,并且采用了一些算法和数据结构来优化解决方案。解决方案。
2023-04-04 16:09:46 160
原创 day29 * 491.递增子序列 * 46.全排列 * 47.全排列 II
首先,我们来看看第一道题目:491.递增子序列。在本题中,我们可以使用回溯算法来枚举所有可能的子序列,然后判断它们是否为递增子序列。最后,我们来看看第三道题目:47.全排列 II。这道题目要求我们找到给定数组的所有排列,但是不能包含重复的排列。在本题中,我们可以使用回溯算法来枚举所有可能的排列,然后判断它们是否为合法排列且没有出现过。在本题中,我们可以使用回溯算法来枚举所有可能的排列,然后判断它们是否为合法排列。这三道题目都是经典的算法题目,涉及到了多种数据结构和算法知识,也是算法学习的基础。
2023-04-04 16:02:34 127
原创 day28 ● 93.复原IP地址 ● 78.子集 ● 90.子集II
第一个判断是,如果当前已经处理好的子集长度等于原始数组的长度,那么说明已经处理完了,我们就可以将当前子集添加到最终结果中,然后直接返回即可。第一个判断是,如果当前已经处理好的子集长度等于原始数组的长度,那么说明已经处理完了,我们就可以将当前子集添加到最终结果中,然后直接返回即可。递归函数需要五个参数,分别表示当前已经处理的位置、当前已经处理好的子集、原始数组、当前子集的长度以及最终结果。递归函数需要四个参数,分别表示当前已经处理的字符串的起始位置、当前已经处理的段数、当前已经处理好的IP地址以及最终结果。
2023-04-04 16:00:15 318
原创 day27 ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串
这道题目是一个典型的回溯算法问题。我们可以先将数组排序,然后从小到大依次枚举每一个数,每次将当前数加入到已选集合中,然后递归搜索剩余的部分,直到满足条件或者不满足条件为止。定义dp[i][j]为true,当且仅当s[i]等于s[j],并且s[i+1]到s[j-1]是回文串。具体来说,我们可以先预处理出dp数组,然后使用回溯算法枚举所有的可能分割方式,如果当前分割方式是合法的,则将其加入到结果中。这道题目和上一道题目类似,只不过每个数只能用一次,因此我们需要在递归回溯的时候,从当前位置的下一位开始搜索。
2023-04-04 15:27:13 106
原创 day26 回溯算法的部分总结
回溯算法是一种常用于解决排列组合问题、搜索问题的算法,它的基本思想是将问题的解空间转化为一棵树,通过深度优先搜索的方式遍历树上的所有节点,找到符合条件的解。回溯算法通常使用递归实现,每次递归时传入当前搜索的状态和可能的选择,然后进行选择、回溯、取消选择等操作。下面是我对回溯算法的总结,希望能对你有所帮助。1.回溯算法的基本框架回溯算法的基本框架可以概括为以下几个步骤:(1)判断是否到达终止条件,如果是则输出解并返回。(2)遍历所有可能的选择,并进行选择。(3)递归进入下一层,继续选择。
2023-04-04 15:26:25 493
原创 day25 ● 216.组合总和III ● 17.电话号码的字母组合
定义一个backtrack函数,其中传入的参数有当前的组合candidates、当前的和sum、当前已选的数字个数count、需要选的数字个数k、需要得到的和n、以及结果集res。然后从1到9中遍历,如果当前数字不在candidates中且当前数字加上当前和不大于n,则将当前数字加入candidates中,并且递归调用backtrack函数。在backtrack函数中,首先判断当前的数字个数是否等于k,如果是,再判断当前的和是否等于n,如果是,则将当前candidates加入结果集res中。
2023-04-04 15:24:16 503
原创 day24
2.状态空间树:状态空间树是对解空间的一种可视化表示,它由根节点和子节点构成,根节点表示问题的初始状态,子节点表示问题的各种可能的状态。状态空间树的构建:状态空间树是对解空间的一种可视化表示,它由根节点和子节点构成,根节点表示问题的初始状态,子节点表示问题各种可能的状态。3.剪枝:回溯算法中的剪枝是指在搜索过程中,根据问题的特点,对某些无用的状态进行剪枝,以减少搜索的时间复杂度。回溯算法的基本思想:回溯算法的核心是对问题的解空间进行搜索,期间进行剪枝,以减少搜索的时间复杂度。
2023-04-04 15:19:51 131
原创 day23 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
如果该节点的值小于最小边界L,则需要修剪它的左子树,因为左子树的值都小于该节点的值;如果该节点的值大于最大边界R,则需要修剪它的右子树,因为右子树的值都大于该节点的值。因此可以先中序遍历二叉搜索树,将得到的升序数组逆序遍历,并依次累加元素的值,将累加值赋给对应的节点。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。给定一个二叉搜索树(BST),将其转换为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。修剪二叉搜索树(题号:669)
2023-04-04 15:16:30 66
原创 day22 ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
总结一下,二叉搜索树是一种非常重要的数据结构,在刷题过程中,我对它的特点和操作有了更深入的理解。对于二叉搜索树的操作,递归和迭代实现都可以,具体选择哪种方式要根据具体情况而定。● 235. 二叉搜索树的最近公共祖先。● 701.二叉搜索树中的插入操作。● 450.删除二叉搜索树中的节点。
2023-04-04 15:12:00 503
原创 day21 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
我们可以采用递归的方式来解决该问题。对于当前节点,分别递归遍历其左右子树,如果左子树返回的结果不为空,右子树返回的结果也不为空,则说明当前节点为 p 和 q 的最近公共祖先;如果左子树返回的结果为空,则说明 p 和 q 只可能在右子树中,返回右子树的结果;如果右子树返回的结果为空,则说明 p 和 q 只可能在左子树中,返回左子树的结果。时间复杂度:O(n),其中 n 是二叉搜索树中节点的个数。时间复杂度:O(n),其中 n 是二叉搜索树中节点的个数。时间复杂度:O(n),其中 n 是二叉树中节点的个数。
2023-04-04 15:08:16 253
原创 day20 ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
代码技巧在编写二叉树相关算法时,需要考虑到二叉树的特性,即每个节点最多有两个子节点。因此,在编写递归算法时,可以通过传入当前节点的左子节点或右子节点来实现递归。另外,二叉搜索树的特性是左子树的节点值小于根节点,右子树的节点值大于根节点,因此在处理二叉搜索树问题时,可以利用这一特性进行递归或遍历操作。刷题技巧在刷题时,建议先理解题目要求和所给数据结构的特性,再考虑算法实现。对于二叉树相关题目,可以先画出样例树,通过观察样例树的特点来思考算法实现。
2023-04-04 14:59:47 70
原创 day18 二叉树遍历总结
遍历二叉树是指按照一定的顺序遍历二叉树中的每个节点。常见的遍历方式有前序遍历、中序遍历和后序遍历。以下是它们的具体实现:前序遍历:按照“根节点-左子树-右子树”的顺序进行遍历。访问根节点对根节点的左子树进行前序遍历对根节点的右子树进行前序遍历中序遍历:按照“左子树-根节点-右子树”的顺序进行遍历。对根节点的左子树进行中序遍历访问根节点对根节点的右子树进行中序遍历后序遍历:按照“左子树-右子树-根节点”的顺序进行遍历。对根节点的左子树进行后序遍历。
2023-04-04 14:58:15 673
原创 day018 第六章 二叉树 part05
这个题目的主要思路和112题类似,也是使用DFS遍历整棵树,同时记录到达每个节点时的路径和,并且在到达叶子节点时判断路径和是否等于给定的目标和。时间复杂度为O(n^2),其中n是节点的个数,主要是因为每次需要复制一份路径数组。这个题目的主要思路是使用深度优先搜索(DFS)遍历整棵树,同时记录到达每个节点时的路径和,如果到达叶子节点时路径和等于给定的目标和,则返回true。具体的实现可以先找到后序遍历序列中的最后一个节点作为根节点,然后在中序遍历序列中找到根节点的位置,从而确定左子树和右子树的范围。
2023-04-04 14:52:26 777
原创 day17|110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和
day17|110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和
2023-02-18 14:41:15 50
原创 day13| 239. 滑动窗口最大值,347.前 K 个高频元素,总结
day13| 239. 滑动窗口最大值,347.前 K 个高频元素,总结
2023-02-13 15:09:40 152
原创 day11|20. 有效的括号,1047. 删除字符串中的所有相邻重复项 ,150. 逆波兰表达式求值
day11|20. 有效的括号,1047. 删除字符串中的所有相邻重复项 ,150. 逆波兰表达式求值
2023-02-12 00:16:11 49
原创 day08|344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格 ,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
day08|344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格 ,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
2023-02-08 12:30:47 79
原创 day07| 454.四数相加II,383. 赎金信 ,15. 三数之和 ,18. 四数之和,总结
哈希法结合排序、双指针完成包括去重等诸多细节在内的复杂任务
2023-02-08 00:34:41 119
原创 day06| 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
day06| 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
2023-02-06 03:24:31 418
原创 day04| 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结
day04| 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结
2023-02-04 05:07:57 571
原创 day03| 203.移除链表元素, 707.设计链表, 206.反转链表
day03| 203.移除链表元素, 707.设计链表, 206.反转链表
2023-02-03 04:28:25 868
原创 day02| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
数组这一章学习了二分法和双指针法(滑动窗口实质是双指针)。都可以降低暴力解法的时间复杂度。
2023-02-02 23:53:07 896
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人