- 博客(34)
- 收藏
- 关注
原创 代码随想录算法训练营第三十二天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
思考:这道题对于有数学基础的人来讲并不复杂,只要清楚理解递推公式,并初始化好前两项值,就可以由递推公式计算结果。F(n) = F(n - 1) + F(n - 2),其中 n > 1在代码实现层面,通过递归实现对前两项的求和。
2025-04-13 16:01:26
118
原创 代码随想录算法训练营第三十一天|56. 合并区间、738.单调递增的数字、968.监控二叉树
思考:本题需要对有重叠区间进行合并,最终结果存放多个无重叠的区间。首先对原始数组按照区间左边界由小到大排序,这样便于从左到右遍历区间。每次结果保存的都是一个区间,只有当无重叠的情况才会保存该区间,这个被保存的区间需要随着遍历更新,因此初始化left和right为数组的第一个区间的左右边界。相邻两个区间不重叠时,前面的区间就可以被保存下来,然后left和right就切换为下一个区间的左右边界。相邻两个区间重叠时,新的左边界是两个区间左边界的最小值,新的右边界是两个区间右边界的最大值。
2025-04-13 14:53:15
261
原创 代码随想录算法训练营第三十天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
思考:本题需要判断相邻气球的重叠情况,有重叠的话可共用一支箭,无需加箭。判断相邻气球重叠,则需要下一个气球的左边界<=上一个气球的右边界,同时需要更新二者重叠区间的右边界,以此和再下一个气球进行判断。当遍历完整个数组后,即可得到最少的箭数(这里要注意的是数组需要提前排序,按照气球左边界由小到大排序)。
2025-04-13 11:37:54
87
原创 代码随想录算法训练营第二十九天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
思考:为了使得汽车可以跑一圈,汽车在每个站点的时候邮箱里都是有油的,即从上一个站点加油开车过来消耗后还剩下油。如果中途某个站点汽车没有剩余油,则说明当前选择的起点不满足要求,更换起点。(从第一个点开始作为起点,不满足条件则换下一个点作为起点)当汽车跑完一圈回到起点时,也要保证此时车内有剩余的油才行。
2025-04-11 00:47:33
352
原创 代码随想录算法训练营第二十八天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和
思考:买卖股票想要利润最大,则每次买卖都是赚钱的,即每一次的利润都是正数。第一天只能买入,不能卖出,因此卖出操作最早在第二天才可以。因此可以从第二天开始,计算相邻两天的利润,把正数的利润求和,就是最大利润。
2025-04-08 21:44:57
372
原创 代码随想录算法训练营第二十七天|455.分发饼干、376. 摆动序列、53. 最大子序和
思考:为了尽可能满足最多的孩子的胃口,则饼干应尽量不造成浪费,即每一块饼干都匹配给了饼干可以满足的胃口最大的孩子。题目中s存在空值,则当没有饼干的时候可以满足的孩子数量为0。为了达到每一块饼干都给了饼干可以满足的胃口最大的孩子,故需要把饼干由大到小、孩子胃口由大到小进行遍历,使得大饼干给了胃口大的孩子。用for循环由大到小遍历孩子的胃口,用指针由大到小遍历饼干尺寸,当饼干尺寸可以满足孩子胃口时,指针左移,计数结果+1.
2025-04-07 21:29:16
249
原创 代码随想录算法训练营第二十五天|491.递增子序列、46.全排列、47.全排列 II
思考:本题给出的数组已经是递增顺序,数组元素存在重复,且在一个结果中可以出现两个相同元素作为递增序列,因此在遍历树结构时,同一层级需要元素去重,这里采用集合记录元素使用情况。其余部分采用递归+回溯思想实现。
2025-04-05 17:44:32
172
原创 代码随想录算法训练营第二十四天|93.复原IP地址、78.子集、90.子集II
思考:本题需要在给出的字符串中分割三次,每次采用"."进行分割,分割后的四个部分,每一部分都要满足:(1)是不以0开头的整数;(2)范围在0-255之间。分割次数达到3次作为终止条件,对于每一段分割的字符内容,都需要判断合法性。只有当前一段合法后,才会递归到下一段。
2025-04-05 16:34:07
196
原创 代码随想录算法训练营第二十三天| 39. 组合总和、40.组合总和II、131.分割回文串
思考:本题也可以抽象为在一个树结构中寻找路径,使得路径上的节点之和为target,特别之处在于本题相同元素可以重复使用,因此对于树结构的每个节点,可选值的范围都是相同的。在选值时需要考虑的就是路径和与target的大小关系,等于target和大于target这两种情况都是终止条件。结合递归与回溯去遍历树结构,循环结构中其实可以无限循环,只有达到终止条件才会退出。
2025-04-03 20:41:18
230
原创 代码随想录算法训练营第二十二天| 77. 组合、216.组合总和III、17.电话号码的字母组合
思考:组合问题,可以理解为在树结构中找路径的问题,这样便于理解递归+回溯的思想。如下图:在[1, n]中寻找k个数字的所有组合情况,相当于在这样一个树结构中寻找不同的路径。最后返回的结果,就是把所有路径放在一个数组中。寻找路径相当于遍历这棵树,因此需要递归,在这个树的节点上,可以有多种选择,比如取2,取3,取4,因此需要回溯。当一个路径包含的元素数=k时,该路径符合要求,可以保存下来。由于是寻找组合情况,相同数字不可以重复取,因此当取过一个数字时,剩下可以取的数字数量就是d=k - len(path)
2025-04-02 23:54:07
335
原创 代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
思考:本题类似,本题给出的是[low, high]区间,在区间内的节点保留,不在区间内的删除,450题是值等于key的节点删除,两道题其实都需要删除节点重构二叉树,故解题方法其实相同,基于递归遍历二叉树,分情况讨论。两道题的难点就在于情况很多,可能有遗漏。大体上还是四种情况:(1)当前节点无左右子树,根据当前节点值与区间[low, high]的关系返回空值或保留当前节点;(2)当前节点只有左子树,先判断当前节点能否保留,再递归左子树;(3)当前节点只有右子树,先判断当前节点能否保留,再递归右子树;
2025-04-01 21:10:00
294
原创 代码随想录算法训练营第二十天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
思考:本题类似,不同点在于本题为二叉搜索树,采用236题解法也可以做,但是没有使用到二叉搜索树的性质,即对于每一个节点,左节点数值小于根节点,右节点数值大于根节点。因此可以考虑通过比较节点的数值大小求解,若目标节点p,q的数值都比当前节点小,则p,q的最近公共祖先一定在当前节点的左子树中;若目标节点p,q的数值都比当前节点大,则p,q的最近公共祖先一定在当前节点的右子树中;若目标节点p,q的数值相比当前节点一大一小,则p,q的最近公共祖先为当前节点。整体还是基于递归的思想去遍历节点。
2025-03-31 20:22:21
223
原创 代码随想录算法训练营第十八天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
如果两个目标节点都在右子树中找到,则右节点就是公共祖先。思考:找到众数,就需要统计每个数字出现的频率,会想到采用哈希表做统计,在python中采用字典进行存储。思考:首先一个节点自身可以是自己的祖先,若两个指定节点中有一个是二叉树的根节点,那么它就是公共祖先。这里需要知道,二叉搜索数本身是有序的,即左节点的值小于根节点值,右节点的值大于根节点值。然后对统计结果进行频率排序,找到出现频率最大的元素,保存到结果数组中。如果在左右子树各找到一个目标节点,则当前节点就是它们的公共祖先。501.二叉搜索树中的众数。
2025-03-29 23:09:40
276
原创 代码随想录算法训练营第十七天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
思考:本题可以理解为将一个二叉树叠加到另一个二叉树上,如果对应位置节点重叠,则两棵树的对应节点值相加,如果对应位置一棵树有节点另一个无节点,则该位置直接采用有节点的树的节点,同样采用递归思想构建左右子树。思考:二叉搜索树的规律是,对于所有的节点,其左节点数值小于根节点,右节点数值大于根节点,因此二叉搜索树是有序的。,都是通过寻找最大值作为根节点,最大值左右两侧元素用于构建该根节点的左右子树,采用递归思想。思考:二叉搜索树的规律是,对于所有的节点,其左节点数值小于根节点,右节点数值大于根节点。
2025-03-28 14:37:47
165
原创 代码随想录算法训练营第十六天| 513.找树左下角的值、112.路径总和、113.路径总和II、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
方法一致,在这类题目中,前序遍历或者后续遍历可以最先获取到根节点元素值(前序遍历第一个元素是根节点值,后序遍历最后一个元素是),然后找到中序遍历结果中根节点值的索引位置,划分左右子树元素。中序遍历是左根右,后续遍历是左右根,两种都是左子树的元素在数组左侧,去除根节点后,右侧都是右子树的元素,根据元素数量相等可以在后续遍历结果中划分出左右子树的元素。思考:首先可以根据后续遍历的最后一个元素值确定根节点,其次,在中序遍历的结果中,根节点值左右的元素分别是根节点的左右子树的节点值,由此可以划分出左右子树的元素。
2025-03-28 00:42:15
320
原创 代码随想录算法训练营第十五天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数
思考:平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。但是求高度与求深度的逻辑其实还是类似的,采用递归法分别计算左右子树的高度,二叉树的高度就在子树最大高度的基础上+1。思考:本题需要统计二叉树的所有路径,对于每条路径,只有当前节点不存在子节点的时候,才算完成走完一条路径,此时才可以对路径结果进行转换,生成符合题目要求的字符串形式。思考:由题意可知,左叶子是一个没有子节点的左节点。对于每个子节点,统计该节点下面的所有路径后,需要返回上一级,以便于统计其他子节点的路径,即回溯。
2025-03-26 22:44:03
165
原创 代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
换个角度,将这个二叉树复制一份,则有两个二叉树AB,A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样。思考:二叉树的最小深度,需要找到根节点到叶子结点的最小距离。思考:二叉树的最大深度,即左右子树的最大深度+1,具有最大深度的路径一定在二叉树的最底层,因此进行递归,直到左右子树为空,即从最末一层节点开始,然后逐级向上+1进行递归。完全一样就是要么都为空,要么都不为空且两个节点值相等,两个节点的左右子树镜像相等(即A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样)。
2025-03-25 22:58:30
202
原创 代码随想录算法训练营第十三天| 二叉树递归遍历、层序遍历
今日题目144.二叉树的前序遍历题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)思考:前序遍历就是根、左、右的顺序,运用递归思路,定义一个函数pretraver用于向数组中存储节点值,分别存储根节点、左节点、右节点,即采用递归方法。随后在主函数中定义空数组,调用函数pretraver。
2025-03-24 22:23:51
202
原创 代码随想录算法训练营第十一天| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
这里要注意的问题是,可能存在多个元素出现的频率一样,这样的话,当这个频率在前k个里面时,一下就增加了多个元素,其实已经找到了k个元素了,但是统计次数还没有到k次,这样就会出错。比如,["2","1","+","3","*"],从头遍历,第一个运算符是"+",所以先计算2+1=3,其实就变成了["3","3","*"],那么接下来就是3*3=9,因此输出9。元素入队后,当队列中的元素数超过k时,就要弹出最左侧的元素,以此保证队列中最多有k个元素。150. 逆波兰表达式求值。347.前 K 个高频元素。
2025-03-22 22:57:02
309
原创 代码随想录算法训练营第十天| 232.用栈实现队列、225. 用队列实现栈 、20. 有效的括号、1047. 删除字符串中的所有相邻重复项
把入栈的元素都给出栈后,再由出栈去pop()。理解了pop()后,peek()作用是返回队列开头元素(不是删除),队列开头元素就是第一个出队列的,也就是出栈里第一个弹出的,所以用pop()拿到这个元素的值,还要再把这个元素再放回出栈里面去(不然的话队列就少了一个元素),这里放回去直接就给出栈append了,而不是从入栈开始进入(因为这样顺序会不一致)。简化一下,就是每次出现一个左括号,就记录一个对应的右括号,这样,当相同右括号出现的时候,恰好被记录的最后一个元素也是相同右括号,才可以一起消失。
2025-03-21 23:07:50
704
原创 代码随想录算法训练营第九天| 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串
i的变化范围是1到n/2,每隔i个下标的字符是相同的,即s[j] == s[j-i],j的变化范围是i到n。空格问题借助Python字符串内置函数split()可以直接得到单词,并且将字符串转为了列表,之后再从列表转回字符串,使用" ".join()方法。关键在于重复,子字符串的长度为i的话,就是每隔i个下标的字符就是相同的,而且要整个数组从头到尾都满足每隔i个下标的字符是相同的。思考:一个字符串中至少要由两个相同的子字符串组成才满足题意,因此子字符串的长度可以从1到n/2。459.重复的子字符串。
2025-03-20 22:37:31
351
原创 代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、替换数字
所以,首先创建一个足够长度的空字符数组,然后从数组末尾开始填写字符,原数组也是从末尾开始进行遍历,逐个判断,如果是字母就直接写到新数组中,如果是数字,就要把当前下标到前面的6个位置写入number。假设数组只有偶数个元素,比如4个,["h","e","l","l"],index只需走过"h","e"就可以了,"e"下标为1,len(s)//2=2,因此需要index<len(s)//2,无需=的情况。总结一下区间的移动,其实就是每一个长度为2k的区间中,处理前k个字符串,进行反转。2、分段反转字符串。
2025-03-19 23:37:32
577
原创 代码随想录算法训练营第七天| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
当前这道题目有四个数组,如果使用四个哈希表的话,其实并没有简化问题,因此应该考虑把数组两两合并,那么是采用两个哈希表吗?本题特点是四个元素相加为0,其实又类似242题,只需要一个哈希表就行,哈希表的key代表两个数组的两个元素之和,另外两个数组元素的和要想与之相加为0,则值为-key,key对应的value值表示有几种组合使得和为value,把符合条件的value值累加到一起就是结果。思考:这道题类似上面的三数字之和,都是在同一个数组里找元素,不同之处在于三个变成了四个,而且target不固定为0。
2025-03-18 21:00:43
235
原创 代码随想录算法训练营第六天| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
由此,可以考虑对两个记录数组相同索引位置上的元素进行乘法,只有同时不为0的位置,乘积结果是大于0的,也就是两个数组的交集,其他非交集的位置乘积一定是0。思考:首先需要思考求一个数每个位置上的数字的平方和,需要实现一个函数,利用python内置的divmod函数实现计算一个数除以10的商和余数,每次加上余数的平方,直到商不存在时,表明已经把这个数的所有位置都取出来了。两数之和,即数组中存在两个元素相加和为target,换个说法就是用target减去一个元素,得到的差也恰好在数组中,则返回减数和差的下标。
2025-03-17 22:54:44
501
原创 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142.环形链表II
因为是倒数第n个节点,所以被删除节点与链表末尾的距离是固定的,因此,构造快慢指针,让两个指针的位置距离刚好是n,这样当快指针从头结点移动到链表末尾时,慢指针刚好移动到了被删除节点的上一个节点,直接将慢指针所在节点的next指针指向下下个节点即可。看了题解后,理解了最简单的办法,先求两个链表的长度(如果有交点,则肯定末尾有一段是相同的),长度较长的链表前面肯定不同,因此长链表指针先移动它比另一个链表多出来的长度后,再开始两个链表指针同步移动,每次移动一步,直到两个指针所在节点相同时,这个节点就是交点。
2025-03-15 13:58:53
665
原创 代码随想录算法训练营第三天| 203.移除链表元素 、707.设计链表 、206.反转链表
思考:反转链表,就是要让每一个节点的next指针都指向前面的节点,且翻转后的链表最后一个节点要指向空节点。因此,这就需要一个tmp节点预先存储当前节点的下一个节点,以便cur的next指针指向pre后,pre可以移动到cur的位置,cur可以切换到下一个位置,直到cur来到原始链表的最后一个节点的后方,即空节点时,循环结束。功能主要分为:1、获取下标为index的节点的值;思考:链表每个节点都有next指针指向下一个节点,要删除一个节点,只需要把指向这个节点的指针,指给本节点的下一个节点即可。
2025-03-14 23:53:18
274
原创 代码随想录算法训练营第二天| 209.长度最小的子数组、59.螺旋矩阵II
思考:一个字,不会写。以前在力扣有刷过,很久了,当时也没记住。这道题需要思考旋转的路径,分段处理,每段的边界值都需要特殊考虑,还有矩阵最中间的值。仔细看代码其实还是很有规律的,按照旋转顺序分成上->右->下->左四个部分,需要注意的是循环的条件和x,y坐标如何表示。思考:这道题一般第一次写都可以写出来一部分代码,但是好多细节容易处理不好,1、循环的条件设置;2、左右指针的移动,sum何时加右指针的值,何时减去左指针的值;其实真正有效的代码都很简单,自己写就总是越写越多,要做到逻辑清晰太难了。
2025-03-13 23:55:38
167
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方
思考:1、最简单暴力解法,先求平方,再排序;2、由于原数组有序,双指针法巧妙的从两侧向中间移动,平方值较大的放在新数组最右侧,这个思路一般想不到。思考:1、数组中符合要求的元素向左边移动拷贝;2、快慢指针的移动规则,这里值得深思,很容易出错。思考:1、数组有序,二分查找效率高;2、双指针法锁定查找区间;3、要注意区间开闭。977.有序数组的平方。
2025-03-12 20:35:24
202
原创 YOLOV8 Openvino Opencv C++ VS code部署推理
YOLOV8基于Openvino推理框架和opencv的CPU设备C++部署推理
2024-09-29 15:37:54
861
原创 YOLOV8 Onnxruntime OpenCV C++ VS2019部署推理
在windows设备上基于CPU部署yolov8测试,依赖opencv和onnxruntime。
2024-09-29 11:00:42
1792
2
原创 Win10安装的WSL子系统占用磁盘空间过大如何释放
前段时间为了参加算法竞赛,在自己的win10台式机上安装了WSL ubuntu子系统用来开发程序,比赛需要提交docker镜像。
2024-09-28 14:01:40
2077
原创 【QT】应用程序输出中文乱码解决方案(亲测有效)
1.点击“编辑”,选择“选项”,在“Preferences” -> “Interface” 里,将“Text codec for tools”选择为“GB2321”,点击“OK”。:有些方法采用选择为“UTF-8”,我试过,在我的电脑中不起作用,大家都可尝试。使用QT编写代码编译中文输出时,在应用程序输出窗口打印的中文乱码。2. 然后“Ctrl + R”重新编译即可。
2023-10-22 15:31:23
2220
1
原创 论文阅读:AdaFuse: Adaptive Temporal Fusion Network for Efficient Action Recognition - ICLR2021
文章提出了一种称为 AdaFuse 的自适应时间融合网络,它动态地融合来自当前和过去特征图的通道,以进行强大的时间建模。该方法在必要时重用历史特征(即,动态决定每个层和每个实例保留、重用或跳过哪些通道),目的是提高识别率和效率。该方法可以作为插件操作用于各种基于 2D CNN 的动作识别架构。该方法的概念图如下:对于历史特征图和当前特征图,先通过全局平均池化得到特征向量,然后将特征向量输入预测网络,预测网络输出结果pt取值如下:pt=0代表将特征图保留(即进行正常卷积操作);pt=1代表重.
2022-03-15 16:01:25
4743
原创 论文阅读:A3D Adaptive 3D Networks for Video Action Recognition-CVPR2020
论文地址:https://arxiv.org/pdf/2011.12384v1.pdf文章介绍了 A3D,这是一种自适应 3D 网络,可以通过一次性训练在广泛的计算约束下进行推断。它不是以网格搜索方式训练多个模型,而是通过在网络宽度和时空分辨率之间进行权衡来生成良好的配置。论文提出了子网络与全网络相互训练的方式,即时空蒸馏策略,以促进不同网络配置之间的知识转移。网络主干采用SlowFast,通过对网络宽度系数和时空分辨率因子在一定范围内随机采样,组合出多种训练配置,通过多路径权衡和自..
2022-03-10 21:50:32
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人