- 博客(48)
- 收藏
- 关注
原创 笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花
遍历顺序:根据递推公式,得到grid[i][j][k]需要用到grid[i][k][k - 1],grid[k][j][k - 1] ,grid[i][j][k - 1],故吧k放在最外层。取一个最小值:grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1]),它把“最大的”元素放在堆顶。2、节点i 到 节点j 的最短路径不经过节点k,grid[i][j][k] = grid[i][j][k - 1]
2025-04-14 22:05:02
826
原创 笔记:代码随想录算法训练营day66:Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路、bellman_ford之单源有限最短路
这一部分真是挺难。
2025-04-11 21:29:24
244
原创 笔记:代码随想录算法训练营day65:dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
答案是当然,可以随便更改1到2,1到3,2到3三个位置处的权值,取一个极端情况,1到2和1到3都是1,但第一步选的1到3,因为是正数,所以1到2的1随便加一个正数都比1到3大了,所以不会出现错过1到2到3权值更小但被错过的情况。将边按权值(将当前点的下一节点以及边的值)放入优先级队列,判定条件依然为minDis数组[当前](代表当前节点到源节点的最短距离)的值是否大于minDis[上一节点]在判断条件中要加上判断该节点minDist数组是否被计算过,边的起点的minDist没被更新时不能更新边的终点。
2025-04-04 16:41:47
828
原创 笔记:docker安装(ubuntu 20.04)
第一句正常,但是第二条命令会报错:这个错误表明,通常是因为(比如访问 Docker Hub 受限或超时)可以先试一下检查 Docker 运行状态(虽然大概不是这里的问题)如果status显示,说明 Docker 正常尝试手动拉取。
2025-04-02 14:18:55
492
原创 笔记:代码随想录算法训练营day64:拓扑排序精讲、dijkstra(朴素版)精讲
要先处理被依赖的文件。两步曲:找到入度为0的节点,加入结果;删除入度为0的节点(具体操作为将其通向的节点的入度数减一,从而可以判断删除之后的节点了)还是要看一下模拟过程,感觉贪心有一个特别精妙的点在于,直觉上感觉是每一次都选择最短路径可能会错过其他路径,但代码实现起来其实是都考虑到了。相对于prim算法 minDist表示 节点到最小生成树的最小距离,dijksta算法minDist表示 节点到源点的最小距离。整个过程使用广度优先搜索完成,毕竟每一次要记录该节点通向的所有节点,与广度优先搜索非常契合。
2025-04-01 14:54:01
249
原创 笔记:代码随想录算法训练营day63:prim算法精讲、kruskal算法精讲
Prim 算法 时间复杂度为 O(n^2),其中 n 为节点数量,它的运行效率和图中边树无关,适用稠密图。更新非生成树节点到最小生成树的距离,要重点理解更新这个词,有点动态规划的意思,因为这个距离的数组的变化是。无向有权图,最小生成树是所有节点的最小连通子图,即:以最小的成本(边的权值)将图中所有节点链接到一起。将节点加入最小生成树,对于该求最小权值和的题,该步就是记录一下该节点已经加入生成树。比较绕的一点是加入的是边,但是是主要操作的是节点。刚添加的这个节点引起的。
2025-03-31 15:14:27
328
原创 笔记:ROS时间戳转换查看(python)
开始的秒数,通常是一个浮点数,整数部分是秒,小数部分是纳秒。例如:1740204002.4807932,它表示的是。ROS 的时间戳通常是以。
2025-03-30 17:04:37
269
原创 笔记:代码随想录算法训练营day62:108.冗余连接、109.冗余连接II
对于有两个入度的节点的情况,需要先倒序记录节点入度情况,找到入度为2的那个节点对应的两条边,判断应该删除哪条边。判断方法为,先看第一条(之前是倒序遍历,即看最后这条),用isSame函数判段是否为构成环的这条边,如果是,cout这条,如果不是cout另一条;判断是否有环的依据为,利用并查集,isSame函数,判断当下这条边的两个节点入集前是否为同根,如果是的话,该边就是会构成环的那条边。如果没有入度为2的节点,即情况3,直接用isSame函数判断就可以了。对于vector,赋值方法。
2025-03-28 14:10:47
213
原创 笔记:代码随想录算法训练营day60:并查集理论基础、寻找存在的路径
本文为学习过程中的思考find是找的顶头上司,而不是当前上司,最后怎么也得找到一个顶头上司的上司是自己,要不然这个结构也不成立使用issame替换会使被操作者为当前节点,而非根节点。join(u,v)的功能为将v的根节点挂到u的根节点下模拟过程可以看出,join中的find中的路径压缩要在长度大于2(路径大于1)的时候才会体现出来。
2025-03-23 20:59:00
273
原创 笔记:代码随想录算法训练营day59:110.字符串接龙 、105.有向图的完全可达性、106.岛屿的周长
还是有些许复杂,要把字符串从begin开始遍历,然后把每一个字母都换一下,看能否在字典里找到,如果能找到就入队列并记录,一直到最后。到有向图了,这道题其实还是搜索一遍看能不能搜索到。2、先计算所有陆地单元的数量,然后减去重复周长。1、检查每一个陆地单元的靠水的边。并不需要深搜或广搜了,直接暴力。
2025-03-22 23:43:50
433
原创 笔记:代码随想录算法训练营day56:图论理论基础、深搜理论基础、98. 所有可达路径、广搜理论基础
连通图是给无向图的定义,强连通图是给有向图的定义朴素存储:二维数组邻接矩阵深搜是沿着一个方向搜到头再不断回溯,转向;广搜是每一次搜索要把当前能够得到的方向搜个遍深搜三部曲:传入参数、终止条件、处理节点+递推+回溯。
2025-03-18 13:55:22
300
原创 笔记:代码随想录算法训练营day55:LeetCode42. 接雨水、84.柱状图中最大的矩形
单调栈:遇到比栈顶小的值和等于的值就入栈,相当于等待那个大的出现,如次栈顶的下一个下标对应的值比它大,再遇到大的,正好栈顶元素的两边会比其大。先看单调栈的方法:首先要理解求这个面积的方法是当前的值为高,宽为左边比其小到右边比其小的这个距离,高乘宽为能勾勒的最大矩形的面积。这次是找两边的小值,逻辑上是接雨水变一下操作逻辑,当前大于等于栈顶的情况入栈,等那个小的,这样栈顶两侧都比其小。这次双指针也是记录的下标了,而且和上一题不同的一个地方是,不是找两侧的最小的,而是找到第一个比其小的就停。
2025-03-17 17:38:34
306
原创 笔记:代码随想录算法训练营day48:739. 每日温度\496.下一个更大元素 I\503.下一个更大元素II
可将原数组复制一份到自己后面计算,也可让i遍历nums两次,方法为i%nums.size(),举一个例子132132,后面处理最后一个2的时候不会造成正确的被覆盖,因为根据入栈规则,2会入栈,不会处理这里的result。非常巧妙的是,最后需要等于0的时候,正好后面没有比当下大的数的那个数的位置的result保留为0,不用处理。大致意思为用栈存储当前值以及比当前的小的值,但后遇到比当前值大的值的时候再计算。不难发现,<的情况和=的情况可以一并处理。注意题意,nums1是nums2的子集。
2025-03-16 23:41:00
278
原创 笔记:代码随想录算法训练营day46:LeetCode647. 回文子串\516.最长回文子序列
/ 初始化:dp[i][j]在i=j的时候都得是1,首先看递推公式,i=0的话访问j如果从0开始遍历,那访问-1肯定是访问不到,j从j+1开始遍历,这样的话,dp[i][i] 的情况是遍历不到的.或者就单看dp[i][j] = dp[i + 1][j - 1] + 2,也没有遍历dp[i][i]的准备。// 递推公式:如过s[i]==s[j],那么i,j包括两个数或1个数的情况是回文子串,如果包含超过两个数,那么dp[i+1][j-1]是true的话,也返回true,当然不相等就直接false了。
2025-03-16 15:36:25
468
原创 笔记:代码随想录算法训练营Day65:LeetCode115.不同的子序列\583. 两个字符串的删除操作\72. 编辑距离
替换操作,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素,那么只需要一次替换i-1或j-1的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。=word[j-1],要作删元素的操作了,所以是+1,word1删一个或者word2删一个,dp[i-1][j]和dp[i][j-1]是删之前的最小操作数,dp[i][j]:使word1的以i-1为结尾的子序列和word2的j-1为结尾的子序列相等所需要的最少删减次数。
2025-03-15 22:06:03
894
原创 笔记:代码随想录算法训练营day44:LeetCode1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
思路:对于要求连续的,不相等就跳过去了,但是对于不要求连续的,不相等时对上一状态要有一个继承,后面能相等的话好续上,那这样写出来的话dp[i][j]虽然定义为nums1中0~(i-1)和nums2中0~(j-1)的公共子序列,但是公共子序列的结尾不一定是在i-1或j-1。区别在递推公式处,是删掉第二个数组中的数字去碰第一个数组,所以遍历到两个数字不相等的时候,不是比较dp[i][j-1]和dp[i-1][j],而是忽略掉当前的第二个数组的j-1处,直接等于从j-2处继承过来的值。
2025-03-14 17:48:59
408
原创 笔记:代码随想录算法训练营day43:LeetCode300.最长递增子序列、674. 最长连续递增序、 718. 最长重复子数组
初始化:最小也是个1,所以初始化为1,从第二个数开始检查。
2025-03-13 21:53:50
312
原创 笔记:代码随想录算法训练营day42:LeetCode188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
感觉还没有把这个股票的递归变成直觉的东西.anyway,每一天的各种状态都是从上一天的各种状态中优化出来的,到最后的再选择一个最大的状态,应该是没啥问题,不会有漏掉的情况。
2025-03-11 23:41:33
228
原创 笔记:代码随想录算法训练营day41:LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
定义:dp[i][0]为没有操作;dp[i][1]为第一次持有,dp[i][2]为第一次卖出,dp[i][3]为第二次持有,dp[i][4]为第二次卖出(不持有)在第一题的基础上,只需要在递推公式处作一点改动:在持有的情况不是第一天持有了,应该算上之前的利润。递推公式:今天持有分之前就持有和今天才买,今天不持有分之前就不持有和今天才卖。定义:dp[i][0]表示不持有当前股票,dp[i][1]表示持有当前股票。初始化:这下要初始化五个了,其实也可以是四个,那样定义的第一个就不用了。
2025-03-10 21:42:06
465
原创 笔记:代码随想录算法训练营day39:LeetCode 198.打家劫舍,213.打家劫舍II,337.打家劫舍III
递推公式:选当前这家偷能得到的钱和不偷当前这家的钱作比较,选能偷到的最大金额。思路:把上一题的函数打包了,然后把给定数组拆出一个不含第一个数的数组,拆出一个不含第二个数的数组,最后两个一比较。定义:不用dp数组了,按递归来,递归函数定义为该节点偷或不偷两种状态收获的金额。初始化:把第一家和第二家初始化,简单来说,因为递推公式需要i-1和i-2。思路:有点像贪心,是一个不断比较取最大路径的思路。定义:偷到下标为i的这家,能偷到的最大值。单层递归逻辑:还是偷与不偷该节点的比较。
2025-03-08 17:46:08
920
原创 笔记:代码随想录算法训练营day38: LeetCode322. 零钱兑换、279.完全平方数、139.单词拆分;多重背包
我可不可以把动规叫正溯或者前溯求方法:放i 的方法加上不放i(空出位置)的方法求值:max或者min 放或不放i(空出位置)
2025-03-07 14:34:45
479
原创 笔记:代码随想录算法训练营day37:完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
j-coins可能会被覆盖掉,举例coin=1,2,amount=3,根据递推公式dp[j]+=dp[j-coins[i]]和dp[i][j]=dp[i-1][j]+dp[i][j-coins[i]]对比来看,外层是j,一维在物品0时用的j-coins[i]是处理过其他物品后的dp值。这里有录友想,这样拷贝的话, dp[i - 1][j] 的数值会不会 覆盖了 dp[i][j] 的数值呢?递推公式变成了dp[i][j] = max(dp[i - 1][j],这道题求价值,对于一维先遍历谁也是无所谓的。
2025-03-06 13:08:37
305
原创 笔记:代码随想录算法训练营day36:LeetCode1049. 最后一块石头的重量 II、494. 目标和、474.一和零
力扣题目链接思路:如何讲该问题转化为背包问题:还是对半分去碰,对半分去碰碰剩下的就是最小的。然后背包容量就是一半儿,物品重量等于物品价值等于stones[i]和上一题不同的是return什么,这里返回碰完后的值即(sum-target)-(target),这里一定不会出现负数以为‘/’是向下取整public:i++){i++){j--){ //背包容量看成是和的一半儿,用该容量去碰另一半。
2025-03-04 17:15:40
458
原创 打卡代码随想录算法训练营第34天:LeetCode62.不同路径、63. 不同路径 II、343.整数拆分、96.不同的二叉搜索树
后两道题好难。
2025-02-28 19:10:06
148
原创 代码随想录算法训练营第31天:LeetCode509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
动规五部曲:确定动规数组及下标含义;确定递推公式初始化dp数组确定遍历顺序举例推导/打印数组(检查用)解决的是重叠子问题,本状态由上一步状态推导。
2025-02-28 10:14:13
240
原创 代码随想录算法训练营第31天内容:LeetCode56. 合并区间、738.单调递增的数字、968.监控二叉树
然后是为什么flag不初始化为0,如果初始化为0的话,假如为1234,直接就是结果了,那么就会不执行修改数字的这一步,直接所有值就变成9999了。倒着遍历,如果出现倒序,那么就该调整了,调整思路为,例如为121倒序,那么把2-1变成1,然后把1变成9,就成为了比原来数小的最大值。思路:我尝试按重复区间的写法去写,却不能解决如何存入第一个区间的问题,所以还是老老实实按卡哥的思路来了。先放一个区间在结果里,如果遇到重叠区间,直接在结果集里合并,这样就不会漏掉第一个区间了。思路:转换数为字符串,便于处理。
2025-02-27 19:58:35
236
原创 打卡代码随想录算法训练营第30天:LeetCode452. 用最少数量的箭引爆气球、435. 无重叠区间、 763.划分字母区间
思路:是按左边界排一下序(按有边界也行),然后看气球是否重叠,但是写起来不太简单,实现这个策略用的方法为如果i号气球的左边界大于i-1号气球的有边界,就说明不重叠(因为是排过序的),如果i号气球的左边界小于i-1号气球的有边界,那就是重叠了,不需要多来一支箭了,此时关键来了,下一个气球跟这两个气球都不重叠好说,如果重叠了一个就还得多射一支,如果重叠了两个就不用加一支箭了。思路1:是我看得最舒服的一个解法,也是问的大模型。大模型告诉我按右边界排序比按左边界排序要好,不过我没能理解他的解释,好像差不多啊。
2025-02-26 14:30:57
392
原创 打卡代码随想录算法训练营第29天任务:LeetCode 134. 加油站 、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
如果能跑一圈下来,起始点的位置为负数的下一位,是紧挨着负数的,所以不会出现啊某一小段油量不够的情况,可以模拟一下。思路:如果到下一站剩余油量要为负数,就以下一个站作为起始点,最后通过总的剩余油量判断是否能够跑一圈。如果比较的是当前比上一个大,应该按照糖果变多的方向去比较,这样才可以照顾到前面的累计的影响。思路:不在某一个点同时比较两边,而是比较一边,即跟左边比比一遍,跟右边比比一遍。思路:先按身高从高到低排一遍,序号(第二个数)低的在前,再根据序号作插入操作。
2025-02-24 17:49:57
154
原创 打卡代码随想录算法训练营第28天:LeetCode122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、1005.K次取反后最大化的数组和
让找跳到终点的最少步数,并不能限制我们的查找过程,我们的查找步骤不需要最少,所以还是逐位去查找,这里要记录的是步数和最大覆盖范围,如果最大覆盖范围不能到终点,就加一步。方法二可以省略一句,利用了一定可以到达的规则,把最后一个观察位放在了倒数第二个位置,这样i正好为终点又查到最大覆盖范围的时候,还差一步,步数直接+1就行,毕竟没有到不了的情况。思路:逐位观察最大覆盖范围,如果某一位的最大覆盖范围能到达终点,即能跳到终点。注意:观察的位不能超过之前观察的位的最大范围,所以这里的cover是实时变化的。
2025-02-23 21:32:48
298
原创 打卡代码随想录算法训练营第27天:LeetCode 455.分发饼干、376. 摆动序列、53. 最大子序和
思路:个人认为第二种方法更符合我的思维习惯,去让饼干配小孩。遍历饼干,当能喂饱时就在下一块饼干的时候看能不能喂下一个孩子;考虑到两种情况,一种是正常的波峰波谷,二是数字的左右两边一边平,一边变化。第二种情况也是有两种情况,一是单调中间有平,一是摆动之间有平。思路:如果和出现负数,那再往后求和这个负数就是副作用,所以就不用前面的和了,重新求和,转换成C++语言是让前面的和等于0。卡哥给的第一种思路为先让大饼干的去喂胃口大的小孩,即从大往小去配,遍历胃口,当饼干能满足胃口时,再同时往下一步走。
2025-02-16 20:13:03
199
原创 补打卡代码随想录算法训练营第25天(都是补打卡了):LeetCode:491.递增子序列、46.全排列 、47.全排列 II、332.重新安排行程;跳过了51.N皇后和37.解数独
因为是全排列,所以每层的startindex都是0,干脆就不用startindex了,此时需要哈希表记录谁在上一层被用过了。使用unordered_map里套map,map是有序的,符合题目要求的按顺序来。思路:不需要终止条件,因为需要采数值上的组合,自然回溯到底返回会就可以。由于没有重复,所以不用考虑数层的去重了,这里有点像纵向树枝的去重。思路:排列是有序的,注意审题是没有重复数字的序列。思路:重复数字出现了,多一步树层去重,把。思路:该题要记录用过的票,避免陷入死循环。比前一个数小也continue。
2025-02-15 00:15:31
252
原创 打卡代码随想录算法训练营第24天:LeetCode93.复原IP地址、78.子集、 90.子集II
思路:基本回溯模板套上,多判定是否加够三个点了,有三个点了判定最后一串是不是有效,有效可以直接存了。记录的方法主要看是否在横向遍历中了且跟上一位相等,注意i>0条件,否则会溢出。三种小的去重方法:数组记录、unordered_set记录、直接比较。定义一个判断数字有效的函数,在这里第一次学到了遍历求整数数值的方法。path入result也可以写在for里面,不过要先入一下空了。这里要直接在原s上操作增减 ‘.’思路:将问题转换成n叉树遍历一遍树。三种方法都需要提前排下序。
2025-01-14 11:32:12
209
原创 打卡代码随想录算法训练营第23天:LeetCode39. 组合总和、40.组合总和II、 131.分割回文串
两种情况下返回,一是startIndex到尾了,是真正的到尾了,等于s.size()了,因为子串用startIndex作闭区间起点;一是分割出来的子串不是回文子串了,就没有继续分割的必要了。思路:难点在于,两个重复的值放在同一个组合里可以,但是如果这个重复的值自己可以和其他数组成集合的话,不去重就会出现多个重复的组合,而这是不能在题目里通过的。去重方法:使用数组记录前一个与本值相等的值是否出现在该组合,出现过说明在一个组合里不用管,没出现过说明不在一个数组里,用过这个数的就不用了,直接跳过。
2025-01-10 21:47:40
246
原创 打卡代码随想录算法训练营第22天:LeetCode77. 组合 、216.组合总和III、17.电话号码的字母组合
对于这个剪枝的重点n-(k-path.size())+1,随着path.size()的增加,该值实在增加的,也就是说,随着层数加深,遍历过的元素变多,该层的遍历终点(要作为下一层的最后一个遍历起点)是要相应延后的,这个地方有点抽象。递归函数在遍历之内,这样能做所谓的两种遍历,即在横向遍历内做纵向遍历,在纵向遍历内再做横向遍历。思路:比组合多一个比较和是否等于目标和的过程,当然中间有对和的回溯处理,以及当和超过目标和后就可以进行剪枝。思路:结合代码随想录提供的转化为n叉树的图来看会更清晰。
2025-01-07 23:25:29
300
原创 打卡代码随想录算法训练营第20天:LeetCode669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
思路:递归,发现小于区间左边界了把左枝剪掉找右枝,发现大于区间有边界了把右枝剪掉找左枝,返回值该节点返回左枝或右枝就顺便起删除节点的作用了。的值之和,所以右中左序。思路:递归,放中点,以中点为界划分左右。的新值等于原树中大于或等于。思路:递归,因为使每个节点。
2025-01-05 22:39:07
249
原创 打卡代码随想录第20天:LeetCode 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
思路:利用搜索树的有序性,大了往小挪挪,小了往大里挪挪,当不满足大或小或空时,在两个值的闭区间里了就是找到了,返回该值就是最近公共祖先。找到的第一个就是最近公共祖先。思路:难点在于如果该点正好在树的中间有左孩子又有有孩子,这时考虑把其左子树转移到他右孩子的左子树的末尾,其右孩子也就到了其原来的位置了。思路:找到合适的末尾节点加在后面就可以了,还是大了就往小走,小了往右走。迭代法:和递归法一个思路。
2025-01-04 23:58:45
263
原创 打卡代码随想录第18天:LeetCode530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
文中含LLM生成内容。
2025-01-01 22:22:14
340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人