自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 代码随想录算法训练营第三十九天| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

动态规划五部曲:1.dp数组dp[j]表示考虑下标为j以内的房屋在内的可以偷窃的最大金额2.递推公式3.初始化感觉做了背包问题,变简单了。

2025-07-22 00:40:56 145

原创 代码随想录算法训练营第三十八天| 322. 零钱兑换 279.完全平方数 139.单词拆分

动态规划五部曲:1.dp数组dp[j]表示装满容量为j的背包,0-i硬币需要的最少个数2.递推公式3.初始化dp[0]=0,dp[j]初始化最大值4.遍历顺序,无所谓的。

2025-07-21 17:25:52 217

原创 代码随想录算法训练营第三十七天|518.零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。。初始化,只要能装得下就一直装。

2025-07-19 17:51:07 601

原创 代码随想录算法训练营第三十六天|1049.最后一块石头的重量II 494.目标和 474.一和零

没想明白背包的容量和物品价值以及重量怎么表示,看看解析,本题和昨天的分割等和子集,思路相似,原来是判断能不能装满sum/2的背包,现在是尽量装满sum/2的背包,最后输出的结果应当是sum-2*dp[target]

2025-07-15 11:45:38 400

原创 代码随想录算法训练营第三十五天|416. 分割等和子集

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。五部曲复习一下:1.dp数组及下标的含义dp[i][j]表示从0-i物品中任取,放到背包容量为j的背包中的最大价值是多少2.递推公式(1)不放当前物品(2)放当前物品3.初始化只需要初始化,第一行和第一列就可以,下面的都可以递推4.遍历顺序先遍历背包容量还是物品数量都可以。

2025-07-14 21:12:50 257

原创 力扣hot100(7.11)

其实target是在前面找到的,因此我们j要遍历到最后,不能剪枝,而且要让j>i+2,不然会排除结果的,但是这个速度依然慢。时间复杂度O(nlogn),空间复杂度O(1),没有开辟新的空间,但是像这种需要返回下下标的其实最好是不要进行排序的。用滑动窗口的同时,还要引入一个map存储是不是存在。我这个写的超时了,因为有太多次切片,复杂度太高了。时间复杂度O(n),空间复杂度O(n)

2025-07-13 16:23:08 119

原创 代码随想录算法训练营第三十四天|62.不同路径 63. 不同路径 II 343. 整数拆分 96.不同的二叉搜索树

感觉这里已经是二维动态规划了,思路是一样的,五步走,先试试解析的方法更好,直接把第一列和第一行初始化为1,然后就少了很多。

2025-07-13 16:21:07 365

原创 代码随想录算法训练营第三十三天|509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

仔细分析一下,状态转移方程和菲波那切数列是一样的,因为假设我们有n个台阶,要么是从n-1上来,要么是从n上来,这两种状态的和就是现在的状态的值。一个是这个dp数组的下标表示的是cost长度为i的情况下,需要的最小花费(到达第i个台阶所需要花费的最小体力)状态转移方程dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])动态规划是由上一个状态推断出来的,不像贪心只是每次取局部最优解,和前一次没关系。初始化的时候dp[0],dp[1]=0。509. 斐波那契数。

2025-07-13 14:36:33 211

原创 代码随想录算法训练营第三十一天|738.单调递增的数字 968.监控二叉树

这个和贪心有什么关系,我直接看解析了,从最大向最小遍历,然后判断是不是满足递增,这样可能是超时的,贪心的规则比较抽象,首先遍历的顺序应当是从后向前遍历,一旦出现前一位比后一位大的情况,就要让前一位-1,后一位变成9(需要让后面的都变成9,不然不满足递归性质了),这里要处理一下如果前一位-1变成0的情况,好像不用处理。

2025-07-11 08:29:39 169

原创 力扣hot100速通(7.9)|49.字母异位词分组 128.最长连续序列 283.移动零 11.盛最多水的容器 42.接雨水

直接看答案了,思路是用字典,排序后的字符串作为key,排序前的作为value,一步步加入就好了。

2025-07-10 10:57:50 534

原创 代码随想录算法训练营第三十天|452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间 56. 合并区间

简而言之,题目就是要尽可能多的划分片段,但是又要保证不同片段中不包含相同字母没想出来我们应该 贪心的是什么,是要一开始分为全部的片段,然后判断是不是有重叠吗,从前往后,如果有重叠就合并,没重叠就看了解析,压根就不是,我们需要用一个新的列表来统计当前字符出现的最后位置left = 0right = 0result=[]

2025-07-10 10:52:24 198

原创 代码随想录算法训练营第二十九天| 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

这种情况下,是不是应该保证邮箱里面的油越多越好,但是也不一定地方的油多就一定好,因为还要考虑亏损,因此我们考虑的是不是应该是给的和消耗的差值最大的站出发这样去贪心是有问题的,其实暴力可以解决一下子,就是要模拟一圈的过程,保证中间是有油的而且最后可以回到起点,写一下试试吧暴力不过,超时看了解析有两种方案,一种是全局方法分为三种情况:* 如果gas总和小于cost总和的话,无论从哪里出发都不可以的* 如果从0出发,直到最后都没出现累加负值,说明0就是起点。

2025-07-09 09:29:11 315

原创 代码随想录算法训练营第二十八天| 122.买卖股票的最佳时机 II 55. 跳跃游戏 45.跳跃游戏 II 1005.K次取反后最大化的数组和

这个题目感觉和昨天的那个最大子序列和有点儿相似,应该是只要后一天比前一天贵,我们就贪,如果遇到某天降价了,我们就卖掉重置。

2025-07-07 16:02:56 166

原创 代码随想录算法训练营第二十七天|455.分发饼干 376. 摆动序列 53. 最大子序和

序列中没有相同数字,也就是说没有平坡,那么我们就用prediff和curdiff来记录前面的差值和当前的差值,如果说prediff>0&&curdiff<0||prediff<0&&curdiff>0那么说明这就是一个峰值,我们需要记录一下,但是开头由于没算应该得额外加1。这个题目不太会,我直接看解析,看完分析之后,明白贪心的规则是从上下坡的波峰波谷(局部峰值)数量来决定的,因为我们要输出的是序列的长度,因此其实我们就不需要考虑删除元素的事情了,只需要分析序列中波峰波谷的数量。时间复杂度为O(n)

2025-07-07 00:19:15 303

原创 代码随想录算法训练营第二十五天|491.非递减子序列 46.全排列 47.全排列Ⅱ

这个题目其实也是一个典型的集合问题这样的话,不太对我们应该比较的是path里面的最后的元素和要加入的元素之间的大小关系,这样可以过,但是很慢,因为去重逻辑太慢了,我们最好是在搜索过程中去重,所以需要一个used数组,来判断在同层去重这样速度瞬间起飞。

2025-07-04 12:40:54 142

原创 代码随想录算法训练营第二十四天|93.复原IP地址 78.子集 90.子集 II

感觉这个题目和分割字符串很相似,我先试着写一写,难点在于它的分割线其实是固定四个的,而且不能在开头末尾,而且每个分完的要在0-255之间且不能有前导0,自己写出来了我额外引入了一个记录切割次数的变量,然后判断是不是在0到255之间,并保证startindex是0的时候,这个被切分好的长度为1才能加入,这样就能得到正确的结果了。我在这里面没有判断非数字字符的问题,我看解析的代码是又判断的。我是习惯用列表去实现,但是我看解析不是,我懒得跟他们这样做了。

2025-07-04 01:15:11 275

原创 代码随想录算法训练营第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串 93.复原IP地址

这个题目如果不可以重复的话其实是比较好回溯的,但是能重复我得好好想想怎么处理,看了下解析,因为可以重复,所以我们在选取值的时候,有些时候应该是不往前走的其实就是在递归的时候,起始位置不变就好了40.组合总和II这个我一开始是这么写的,但是超时了,因为最后还要组合去重这个题目和上一个的区别就在于,每个值只能使用一次,是不是递归的时候直接往后选就行了呢,答案是不行的,这样会导致出现重复的情况那我就要想一下去重的逻辑了,我在加入的时候判断里面有没有。

2025-07-03 11:03:13 130

原创 代码随想录算法训练营第二十二天| 77. 组合 216.组合总和III 17.电话号码的字母组合

回溯算法是一种搜索算法,它的本质是穷举回溯法可以解决的问题:* 组合问题:N个数里面按一定规则找出k个数的集合* 切割问题:一个字符串按一定规则有集中切割方式* 子集问题:一个N个数的集合里有多少符合条件的子集* 排列问题:N个数按一定规则全排列,有几种排列方式* 棋盘问题:N皇后,解数独等等* 回溯函数模板返回值以及参数* 回溯函数终止条件* 回溯搜索的遍历过程。

2025-07-02 14:44:42 298

原创 代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

我一开始想的是递归判断,如果遇到值小于区间最小值,就返回右子树,但是这钟情况下,没法保证右子树的值是满足区间要求的,就回不来就出现了这种问题,没有被递归删除我又去看了下解析,如果当前节点是空,就直接none这是递归的终止条件,如果当前节点的值小于区间最小值,那么就直接跳过当前节点值去找右子树,同样的如果当前节点的值大于区间最大值,那么就直接跳过当前节点去找左子树;否则,不跳过,保留当前节点的同时去左右两侧递归。

2025-07-01 11:41:35 203

原创 代码随想录算法训练营第二十天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

之前做过二叉树的最近公共祖先,就是一层一层向上回溯,然后递归判断,最后的得到就行了,为了加深印象,我也在写一遍可以通过,但是我暂时没想到怎么利用搜索树的特性,难道是比较大小,我想的是中序遍历之后其实是有顺序的,只要被夹住的就是公共祖先,但是我又想了貌似不对,夹住的可能不止一个值,那就是向上回溯,找到一个大于等于p的节点和一个小于等于q的节点,还是不对,看看解析吧看完解析之后发现自己想的有一部分思路是没问题的,祖先的值肯定是要夹在pq之间的,所以我们从上往下遍历找到第一个这样的值的时候就是我们要找的。

2025-07-01 01:07:20 319

原创 代码随想录算法训练营第十八天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

感觉写的比较麻烦,看看解析,我这个方法可以处理任何树,不一定是二叉搜索树,但是二叉搜索树是有序的,解析的方法就是比较得到的结果数组,去计算出现频率,这个时间复杂度是O(n)的而且不需要开辟一个map的空间而已。找众数是不是也可以变成非递减数组,然后统计相同数字的数量最多的,再或者我直接存map,遍历一下,统计好了,直接找次数最多的(我的里面有排序,因此O(nlogn)我们要寻找最近的公共祖先,就要从底向上遍历,也就是要有回溯的过程,我们依然选择使用递归的方法,三原则要判断好。

2025-06-29 10:32:33 172

原创 代码随想录算法训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

这个其实关键是切分数组,做递归,跟构建二叉树是一样的,写过那个,这个就好点儿了其实长度是不是1不用判断,这个条件多余了。

2025-06-27 11:57:46 255

原创 代码随想录算法训练营第十六天| 513.找到左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

看到这个其实,我想的是层序遍历,然后返回最后一层的第一个元素就好了看一眼解析的递归遍历怎么做的,一开始我想的也是递归,这样会深度优先,但是遍历到最左下角并不一定是最后一层的最左侧节点,这个得特别注意。

2025-06-26 18:02:01 156

原创 代码随想录算法训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

平衡二叉树指的是每个节点左右子树的高度差不超过1,一开始我是这么写的,只判断了左右子树的高度差,这样不行最好的方法就是需要把递归放在判断平衡里面但是这样递归套递归,会不会太复杂,时间复杂度是O(n^2)的,看了下解析,这个不应该求树的最大深度,而是用高度去做,一层一层的找,每一层是不是都是平衡二叉树这样的时间复杂度是O(n)的。

2025-06-25 15:14:13 137

原创 代码随想录算法训练营第十四天|226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

看到这个题目,我们首先要选定遍历的方式,想要交换左右孩子,好像什么遍历方式没影响,之前做了比较多的层序遍历,我还是优先练习使用深度优先遍历方法,按照直观感受来讲,如果当前节点存在子节点,那么交换左右节点的指针就好了。

2025-06-24 23:33:45 165

原创 代码随想录算法训练营第十一天| 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

简单来说,本题目就是求解后缀表达式的结果,没做过类似的,直接看解析了,这个题目有点儿像删除字符串中的所有重复项,遇到数字放进栈,如果遇到运算符,就把栈顶的两个元素拿出来处理,然后重新入栈,最后遍历完,最后弹出的栈顶元素就是结果。

2025-06-24 11:06:32 269

原创 代码随想录算法训练营第十三天| 递归遍历 迭代遍历 统一迭代 层序遍历

中序遍历因为要中间处理父节点,因此,在遍历时,我们的终止条件不仅要让指针指向空,同时stack里面也为空才行,如果指针指向空,stack不为空,说明遍历到叶子节点,需要向上回溯,如果指针不为空,但是stack为空,说明左半边遍历完了,右半边还没开始,如果节点的左孩子一直在的话,就把当前节点放入栈,一直找,如果左节点不在了就弹出栈顶元素并添加到结果中,然后再看当前节点的右节点,一直到循环条件达到为止。如果不为空的话,根节点的左子树及其所有节点的值小于等于根节点的值,右子树及其所有节点的值大于等于根节点的值。

2025-06-24 11:03:29 222

原创 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

栈是先进后出队列是先进先出。

2025-06-20 01:19:32 225

原创 代码随想录算法训练营第九天| 151.反转字符串中的单词 55. 右旋字符串 28.找出字符串中第一个匹配项的下标 459.重复的子字符串

一开始凭自己理解,搞错了题目要求,把每个单词的字符翻转了我能想到的比较简单的方案,就是split拆分句子,然后双指针交换位置,最后合并一下但是问题可以想的复杂一点儿,第一步我们要先除去里面的空格,然后先反转整个字符串,再反转里面的每个单词,这个代码就不看了,第一遍完成就好。

2025-06-19 12:31:44 283

原创 代码随想录算法训练营第 八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

简单题目直接做。

2025-06-17 22:34:09 117

原创 代码随想录算法训练营第七天|哈希表part02 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

这个题目我之前做过,但是有点忘记了,我看了下解析,这个和两数之和比较像,我们可以定义一个map,其中key放求和后的值的数量,value放出现的次数,然后遍历后面两个数组,如果(0-c-d)出现在map里面,那我们就,把value的值统计在结果中。

2025-06-17 15:02:42 226

原创 代码随想录算法训练营第六天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表是根据关键码访问的数据结构。

2025-06-16 15:18:28 223

原创 代码随想录算法训练营第四天|链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 07. 链表相交 142.环形链表II

设置一个头结点,然后循环完成这三个步骤就好了顺序其实没那么重要,设置一个tmp用于存储最前面的,pre用于存储交换的第一个节点,cur用于存储交换的后一个节点其实这个有地方写重复了,一开始的判断没有也一样,我就没删除。

2025-06-14 16:57:15 295

原创 代码随想录算法训练营第三天|链表part01 203.移除链表元素 707.设计链表 206.反转链表

链表是由节点组成的,这个节点有值和指针组成,指针指向下一个节点。链表的地址可以不是连续的。链表的头结点表示链表的第一个节点,尾节点的指针指向null。之前的时候做过,加一个虚拟头结点,便于返回修改过后的链表,先写一个不加虚拟节点的代码,在删除头结点时候要单独处理,同时应该是while处理而不是if,因为删除第一个头结点之后的节点仍然可能是等于val 的。给定一个链表,需要进行反转,那么我们需要定义一个先前节点指针、一个当前节点指针,并用一个临时节点指针存储下一个要反转的节点。

2025-06-13 01:16:41 248

原创 代码随想录算法训练营第二天|数组part02 209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地

看到这个问题,我首先想的是暴力解法,用两个指针来表示满足要求的数组的第一个位置和最后一个位置,fast指针负责找满足求和大于=target 的位置,slow负责记住起始位置并在满足>=时向后移动求最短长度,这样的时间复杂度应该是O(n^3)的,虽然做出来了,但是思想比较low其实单靠两层循环的暴力就能解决,无需像上面一样三层。

2025-06-12 15:51:06 300

原创 代码随想录算法训练营第一天|数组part01 力扣 704. 二分查找 27. 移除元素 977.有序数组的平方

双指针法:因为原数组本身是从小到大有序的,所以平方之后的最大值要么出现在最左侧,要么出现在最右侧,所以我们可以用两个指针,反复比较两头平方之后的大小,如果大的就放到新数组的后面,直到两个指针相遇。简单来说就是,如果遇到等于的值就只走fast,跳过这个,如果遇到不等于的,就让slow=fast,并且都后移,保证slow是新数组的位置。如果左闭右闭的话我们循环的判断条件应当是left<=right因为这是有意义的,同时在更新right的时候应当更改为middle-1。* 连续存储空间上的相同数据类型组成。

2025-06-11 22:56:16 397

原创 大白话谈深度学习中的注意力机制

浅谈深度学习中的注意力机制

2024-07-28 12:23:22 974

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除