自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 day 29 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列 (补)

可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。每个加油站的剩余量rest[i]为gas[i] - cost[i]。

2024-08-12 00:55:01 243

原创 第八章 贪心算法 part02 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和 (补)

难点:1.遍历时注意i的初始值,应该从1开始,因为下标为零的已经被初始化,并且从零开始dp数组下标小于零会报错。2.当天的递推公式利用前一天的dp数组来推。

2024-08-12 00:52:29 207

原创 day 27 第八章 贪心算法 part01 455.分发饼干 376. 摆动序列 53. 最大子序和 (补)

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。

2024-08-12 00:47:35 314

原创 day 26 第七章 回溯算法 part04 491.递增子序列 46.全排列 47.全排列 II (补)

思路:利用回溯算法先dfs整个数组,然后选择符合条件的存入result之中。本体特殊点在于需要一个哈希表集合来存储同层已经被使用过的元素。难点:1.backtracking里面的的i + 1而不是++i;2.回溯算法里面的确定终止递归的条件。

2024-08-12 00:39:56 246

原创 day 24第七章 回溯算法part03 93.复原IP地址 78.子集 90.子集II

思路:利用分割子串的思想递归搜索字符串,比较新的地方在于递归结束条件和回溯时的代码。2.回溯算法只撤销最近的决策,所以startindex不变。难点:1.子函数里的变量什么时候加&

2024-08-11 17:28:52 284

原创 39期代码随想录算法训练营总结

这60天正如卡哥所说前面十几天每天都能跟上,不论是在规定时间还是后面花时间补,最后都能赶上,但是到了中期,我本人是在第24天开始在回溯算法那一章节开始搁置了,因为学校进入复习周,自己就在这次训练营里懈怠了,等到了期末周结束后放暑假了,我终于开始补了,记得一开始不的章节是动态规划,由于这个章节可能相对容易理解再加上本人热情高涨,那几天的效率和积极性都很高,后面到了图论从第5天开始后就没有完整的刷过,每天也是只完成了其中一道,可能因为太难了沉不下心去学。于我而言学算法算是其中之一。

2024-08-10 17:24:28 291

原创 day 62 第十一章:图论part11 Floyd 算法精讲 A * 算法精讲 (A star算法)

在这之前我们讲解过,dijkstra朴素版、dijkstra堆优化、Bellman算法、Bellman队列优化(SPFA) 都是单源最短路,即只能有一个起点。而本题是多源最短路,即 求多个起点到多个终点的多条最短路径。

2024-08-10 17:00:48 522

原创 day 61 第十一章:图论part10 Bellman_ford 队列优化算法(又名SPFA)bellman_ford之判断负权回路 bellman_ford之单源有限最短路

【代码】day 61 第十一章:图论part10 Bellman_ford 队列优化算法(又名SPFA)bellman_ford之判断负权回路 bellman_ford之单源有限最短路。

2024-08-10 16:50:46 282

原创 day 59 第十一章:图论part09 dijkstra(堆优化版)精讲 Bellman_ford 算法精讲(补)

但 n 很大,边 的数量 很小的时候(稀疏图),可以换成从边的角度来求最短路。当 n 很大,边 的数量 也很多的时候(稠密图),那么 上述解法没问题。这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。

2024-08-10 16:45:17 425

原创 day 58 第十一章:图论part08 拓扑排序精讲 dijkstra(朴素版)精讲(bu)

难点:1.拓扑排列运用了bfs的方法,因为过程中用到了queue,类似于按圈想外遍历。思路:利用拓扑排列按顺序将有向图转化为线性图result,并且输出出来。2.通过最后result数组的大小和n的比较可以判断出该有向图是否有环。

2024-08-10 11:55:05 219

原创 day 57 第十一章:图论part07 prim算法精讲(补)

难点:1.prim三部曲:1.确定距离最小生成树的节点:遍历每一个点的mindist[j]与minval进行比较,并记录下当前节点cur.2.将当前节点加入到最小生成树:istree[j] = true.3.更新非生成树节点到最小生成树的最小距离:mindist[j] = grid[cur][i].思路:本质是求最小生成树:以最小成本把所有节点连接在一起:利用prim三部曲,将每个节点到最小生成树的最小距离记录下来(mindist),最后再求mindist数组的加和。

2024-08-10 10:21:21 286

原创 第十一章:图论part06 108.冗余连接 109.冗余连接II (补)

思路:从前到后遍历边,如果当前两个点不在一个集合就使他们加入到一个集合,构成树,如果位于一个集合则输出他们,因为如果把他们加入就会形成环。

2024-08-08 18:51:15 565

原创 第十一章:图论part04 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长(补)

难点:1.哈希表集合和map的创建。集合:unordered_set strlist;2.哈希表的插入操作:visitedstr.insert(pair (beginstr,1));思路:将本题寻找附近的字符串等效于寻找四周的陆地,在此基础上要将字符串对应路径长度,最后输出长度即可。4.用bfs求最短路径,原因在于它是一圈一圈的遍历,当到达目标点时当前路径长一定是最短路径。3.哈希表map的含义:以string为结尾的路径长度int.

2024-08-08 16:44:22 363

原创 第十一章:图论part03

难点:1.本题做标记的方法是将边缘的陆地从1改成2(而不是利用visited进行标记),然后巧妙地利用一个双层for循环直接将孤岛改为海水,最后输出。难点:1.本题做标记不用再申请空间创建visited[][],而是直接将grid的值由1变成0,以此做上标记。思路:用bfs把边缘的陆地及其周边的陆地都变成海洋,并做上标记,然后继续用bfs把未标记的陆地的数量加起来。思路:用bfs将边缘的陆地由1变为2,然后再用一个双层for循环把数值为1的陆地变成0,把2换成1即可。bfs需要构建队列,以此遍历外圈的点。

2024-08-07 17:13:22 682

原创 day 51 第十一章:图论part02 99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积

思路:遇到一个没有遍历过的节点陆地,计数器就加一,然后标记该节点陆地所能遍历到的所有陆地。dfs函数:此题就一个递归终止条件所以不用写确定递归终止的条件,然后确定单层递归逻辑,分别向上右下左四个方向进行递归,符合条件的继续下一层递归。2.一般dfs里面有两个终止递归的地方,一个在确定递归终止条件里,一个在确定单层递归逻辑里,如果当前限制条件较少,这两个终止条件只能写一个,否则答案会错误。一圈一圈地遍历),然后将符合条件的节点压入队列中并标记,然后在弹出队列中的元素一圈一圈的遍历循环往复一直到队列为空。

2024-08-02 19:15:48 317

原创 day 50 深搜理论基础理论 98. 所有可达路径

思路:本题用深搜的方法来做,dfs的过程:把符合题目要求的所有情况加入到result的二维数组中,最后再转化为n个一维数组这样可加入空格并且按要求输出。主函数的过程:将题目给的无环图转化为邻接矩阵,然后将当前节点和目标节点传入dfs函数里面。难点:1.dfs函数里的三部曲中的确定当前层逻辑:首先遍历所有与当前点相连的点,加入到路径中,然后递归下一层,直到后面没有节点了最后系统会自动返回并尝试其他可能,此时你要解决它自动返回后的代码这个代码就是回溯。注意递归中的return不是回溯,而回溯往往在递归后面。

2024-08-01 18:47:28 193

原创 day 49 第十章 单调栈part02 42. 接雨水 84.柱状图中最大的矩形

4.在弹出栈顶元素后需要判断栈是否为空,而此时的栈顶元素对应的高度就是当前点的左侧高度值,然后利用公式求值:h = min(height[st.top()],height[i]) - mid,w = i - st.top() - 1,这里求的是距离所以要减一。思路:本题利用单调栈寻找任一一个元素右侧第一个比他大的元素的位置,而左侧我们用当前元素左侧的那个元素,从而形成一个凹槽(根据单调栈的性质,一定是一个凹槽,只不过宽度可能不是1),然后利用公式求出结果。难点:1.本题的公式是:res = h * w;

2024-08-01 17:19:07 413

原创 day 48 第十章 单调栈part01 739. 每日温度 49503.下一个更大元素II 6.下一个更大元素 I

2.遍历nums2数组,如果当前栈顶元素对应的值在nums1中,则进行下一步判断,如果当前元素对应的值大于栈顶元素如果当前元素对应的值大于栈顶元素对应的值的话,就进行计算距离等操作,注意最后在while循环结束之后才进行st.push(i)的操作。只有单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。难点:1.栈中压入的是数组下标,如果当前元素对应的值小于等于栈顶元素对应的值,那么就将当前元素压入栈中,否则就求得距离并弹出栈顶元素同时压入当前元素。

2024-07-27 10:42:11 1561

原创 day 47 第九章 动态规划part13 647. 回文子串 516.最长回文子序列

3.确定递推公式和遍历顺序时,先确定递推公式:根据画图可以退出dp[i][j]取决于i,j之间的长度和dp[i + 1][j - 1]的情况;难点:1.递推公式的推导:dp[i][j]可以由少一个元素的两种情况的最大值的得出;2.该题的关键在于dp[i][j]的定义:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,数据类型是bool类型。1.本题dp[i][j]的定义与上一题不同:上一题是bool这一题是int类型,表示长度。难点:1.本题dp[i][j]的定义。

2024-07-25 17:25:20 381

原创 day 45 第九章 动态规划part12 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离

思路:此题与判断子序列的区别在于本题有加和的操作,当s[i - 1] == t[j -1]时,有两种情况,第一是不使用当前元素匹配,第二是使用当前元素匹配;思路:本题与不同子序列的区别在于本题两个字符串都能删除,因此在word1[]和word2[]不相等时,有两种情况,而由于要得到最小值,所以取min.难点:1.初始化时dp[i][0]应该都是1,因为s的可以进行删除元素,可以进行删除组成一个空数组,同理dp[0][j]都是零。3.不理解的地方就像dp[i][j]的定义就能理解了。

2024-07-25 11:20:44 198

原创 day 44 第九章 动态规划part11 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

思路:首先本题要求连续数组还要求子数组的和的最大值,因此可以确定dp[i] = max(dp[i - 1] + nums[i],nums[i]),dp[i]的含义:以i为结尾的最大子数组的和。= t[j - 1],那么此时dp[i][j]就等于dp[i][j - 1],因为t更长,而不能是max(dp[i][j - 1],dp[i - 1][j]).补充:dp[i]的含义:以nums[i]为结尾的最大连续子序列的和(未必从零开始),而不是指原数组从nums[0]到nums[i].思路:同最长子序列那道题。

2024-07-23 18:32:53 361

原创 day 43 第九章 动态规划part10 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

难点:1.dp数组的定义dp[i][j]为什么是下标为i - 1而不是i:如果是i的话,在初始化时如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1,因此会多出两行for循环的初始化代码,不如当前写法:第一行和第一列都是零简洁。解释细节1:因为dp[i][j]代表下标以i - 1结尾的A和下标以j - 1结尾的B的最长重复子数组的大小,因此要求第一行dp[0][j]和第一列dp[i][0]都是零,所以省去了初始化的代码。想想之前的章节还落下不少,得找时间补呀。

2024-07-21 18:43:52 383

原创 day 42 第九章 动态规划part09 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

由于**最多**买卖k次的dp数组状态有2 * k + 1个(因为进行零次买卖的状态是零),所以要求我们区分偶数(不持有股票)状态和技术(持有股票)状态的区别从而进行初始化和遍历dp数组。思路:本题较于买卖股票2区别在于它在卖完股票后会有冰冻期,再由递推公式可以得知还需要有的状态是今天卖出的状态和冰冻期的状态,因此一共有四个状态。2.确定递推公式时也要区分偶数和奇数状态:让j 从1开始(因为状态零代表不进行操作,所以永远是0,不需要进行公式推导),并且利用j += 2,j 和j + 1来控制奇数偶数状态。

2024-07-19 17:40:45 426

原创 day 41 第九章 动态规划part08 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III

思路:本题和上一个可进行不限制次数买卖股票的不同之处在于规定了买卖次数,最多两次,这就要求我们对每一天设置五个状态:初始化dp[i][]:一共有i天,每天有五个状态,分别是没操作,第一次持有,第一次不持有,第二次持有,第二次不持有,分别对应0,1,2,3,4。接着初始化dp,最后确定遍历顺序。思路:本题在在一段时间内可以进行多次买卖,所以本题和普通的买卖股票的差别在于dp[i][0],如果是当日买入的话,本题dp[i][0] = 前一天不持有的金钱数 - prices[i],而不是-prices[i].

2024-07-18 17:29:26 442

原创 day 40 第九章 动态规划part07 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

思路:先定义一个dp[i]数组:下标为i之前的房子最多能偷dp[i]的钱。然后确定dp数组的推导公式:dp[i]取决于前一个房子偷不偷:dp[i] = max(dp[i - 1],dp[i - 2] + nums[i])。思路:本题也是一个树形dp。定义一个只含有两个值(一个偷当前节点所得最大金钱,一个不偷所得的最大金钱)的dp数组,更新每个节点的这俩值,最后返回根节点的这俩值的最大值。思路:本题可以将环拆分成不包含首或者尾的两个普通的打家劫舍问题,并且记录这两个值,最后返回最大值。

2024-07-17 16:41:51 325

原创 day 38 第九章 动态规划part06 322. 零钱兑换 279.完全平方数 139.单词拆分

思路:本题抽象为一个多重背包问题,字典里的字符串是物品,s.size()是背包容量。递推公式:如果dp[j]是true,并且i - j 这一段在s里,那么dp[i]是true。2.递推公式的推导:如果dp[j]是true,并且i - j这一段字符出现在字典(转化后的哈希表)中,则dp[i]是true.难点:1.遍历物品时没有包含物品的数组,但是物品的大小有规律,因此直接利用规律遍历物品,初始值是1.2.dp的递推公式:求得是方法数的最小值,因此不是方法数的公式,二者有一定区别。难点:1.递推公式的理解。

2024-07-16 17:44:58 365

原创 day 37 第九章 动态规划 part05 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)

思路:将用不同的硬币凑够面值为target并且每个硬币的数量不限制的问题转化为完全背包问题,target即背包的容量,dp[target]即方法数,而本题较之前的硬币题的区别在于本题是问方法数的排列问题,因此遍历顺序需要先遍历背包再遍历物品。思路:完全背包的整体思路与01背包基本相同,区别在于完全背包每个物品可以取多次,这就导致完全背包在遍历背包时必须顺序遍历。思路:本题是完全背包的组合问题,因此必须先遍历物品再遍历背包。解释细节1:先遍历背包,并且从0开始,所以需要判断i - nums[j] >= 0;

2024-07-14 16:59:54 415

原创 day 36 第九章 动态规划part04 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

思路:本题是背包问题解决一定容量的背包里最多能放多少?本题抽象为有n种物品,将他们尽可能均分成两堆,用容量为sum/2的背包装物品,最后返回包里的和剩余的物品重量的差值即可。思路:本题抽象为求装满容量为x的背包的方法数。x是数组中正数元素的加和,由两个公式推导出来。解释细节1:背包问题能计算出在一定背包容量下的最大的重量或者最大价值。解释细节1:dp[j]代表用物品装满j重量的背包的方法数。思路:装满一个背包用的最大物品数。

2024-07-12 23:35:27 180

原创 day35 动态规划part03 01背包问题 一维 416. 分割等和子集

思路:先设置一个一维dp数组dp[j],代表当背包容量为j时背包能装下的最大价值为dp[j],然后确定递推公式,接着对数组进行初始化,dp[0] = 0,最后用两个for循环进行递推,这里第一层for循环必须遍历物品的种类,第二层必须倒叙遍历背包的容量。dp[j]代表当容量是j时放入的最大物品的重量,所以二者都代表重量。解释细节3:本题的dp[j]代表的意思有所不同注意区别:当背包容量是j时,背包能装下的最大重量。解释细节2:背包问题的一维数组必须满足这两个体条件,而二维数组都可以但也必须是倒叙遍历。

2024-07-12 14:46:15 290

原创 day32 动态规划part02 62.不同路径 63. 不同路径 II

思路:先判断边界,有两种情况,然后再初始化dp数组先都是零,然后如果原数组是零,dp数组就再初始化为1,否则当前dp数组和后面的数组都赋值为零,这里用for循环里的结束条件控制。然后遍历dp数组,利用遍历顺序填充dp数组,这里注意i,j都是从1开始,最后输出dp数组右下角的值。思路:设置一个dp二维数组,确定dp由上面和左面的两个值得到,接着初始化dp数组,第零行和第零列都是1,代表路线方法数是1,然后最后输出右下角位置的数组值。

2024-07-10 00:14:54 274

原创 day 32 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

思路:定义一个dp数组,表示到达第i个台阶需要的最小能量。所以到达第i个台阶的最小能量有两种可能,从前一个台阶加上cost【int- 1】,和从前两个台阶加上cost[i - 2],二者取最小值。

2024-07-09 01:00:29 197

原创 Day 30 第八章 贪心算法 part05 56. 合并区间 738.单调递增的数字

思路:本题只要想清楚个例,例如98,如果前一个数比后一个数大,那么就让前一个数减一后一个数变为9即得正确答案。之后第一个for循环从后往前遍历,让不符合要求的数减一并更新当前的flag的值,第二个for循环从flag到最后一个数中间的数都变成9.思路:先设置一个二维数组result,然后判断边界,如果不为空,**先对原数组进行排序**,接着把第一个区间加入到result之中,然后遍历后面的区间,如果有重叠直接用result.back()[1]进行更改,取当前值和result的最新值的最大值。

2024-07-06 21:01:14 409

原创 Day 29 贪心算法 part04 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

思路:用哈希表先把每个字母在s中的最远位置统计出来,然后遍历s数组让right取right和当前字母最大位置之间的最大值,直到i与right相等,让right - left即得一段字母的个数,然后初始化left的值准备下一段的计算。思路:此题用贪心算法,当前的最优解即最终最优解。先对points二维数组的左边界进行排序,如果当前节点的左边界大于上一个节点的右边界,则让result++,否则改变当前点的右边界,然后遍历下一个点。解释细节1:cmp定义:传入两个需要比较的值,然后直接return大于或者小于。

2024-07-05 18:33:29 490

原创 Day 22 77. 组合 216.组合总和III 17.电话号码的字母组合

思路:1.确定递归函数参数:和77. 组合 (opens new window)一样,依然需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。思路:1.确定函数返回值和参数:在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合,所以我定义全局变量了;2.确定终止条件:path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。当sum的值比n大时,也就终止了。

2024-06-28 17:23:54 523

原创 Day 21 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

左:接着划分区间,root的左孩子接住下一层左区间的构造节点;思路:1.先确定终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了;2.确定单层递归的逻辑:中:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点;中: 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。左:让当前节点的值加上pre的值。思路:1.确定递归终止条件:这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。

2024-06-26 21:09:25 351

原创 Day 20 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 (二叉搜索树专题)

思路:还是按照递归三部曲来做,本题特殊点在于本体的终止条件是当root的val值等于key或者root本身是null的时候,在终止条件中分为没找到就是null的情况和找到了两种情况,在找到的情况下有四种情况;思路:当递归到空节点时,就定义一个新节点并将新节点返回给上一个·递归函数,然后进行添加节点的操作,最后返回到中节点时返回root(不用改二叉树的结构)。思路:根据二叉搜索树的性质:如果当前节点大于p,q那么答案就在当前节点的左子树上,同理推另一种情况。解释细节3:代码中有解释。

2024-06-25 21:48:14 189

原创 day13 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历

思路:利用递归来遍历二叉树里的所有节点,并按顺序把节点的值存入到vec数组中。

2024-06-23 20:37:57 259

原创 LeetCode150. 逆波兰表达式求值

思路:如果当前字符串是算术运算符,则取出栈中两个元素进行运算,否则将数字字符串压入栈中。

2024-06-19 21:38:18 257

原创 LeetCode|| 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

思路:当为左括号时,往栈里加入对应的符号,当是右括号时,比较栈顶和数组元素,此时有两种情况返回false,但如果对应上了就pop,然后接着比较,当数组遍历完最后看栈是否为空。难点:区分stin.top()和stin.pop()的区别,pop()既能返回值也可以删除栈顶元素。思路:把字符串按规则压进栈中,然后利用字符串加和的方法把栈中元素加入到字符串中,然后返回字符串。思路:用一个队列就能实现,将队列前面的元素弹出在重新加入队列的末尾即可,最后弹出队前元素。解释细节4:最后如果是空栈,则返回true。

2024-06-18 21:41:25 369

原创 LeeCode|| 151.翻转字符串里的单词 卡码网:55.右旋转字符串 + 总结双指针算法

思路:首先先把所有空格移除(利用双指针法移除元素),移除的过程中还需要手动加上空格,然后再反转整个字符串后面最后再翻转每个单词。思路:现将整体反转,再把局部反转,主要考察对reverse的利用。难点:这个思路比较难,思考如果是左旋呢?解释难点:左旋先局部后整体。针对数组删除操作的问题。

2024-06-17 11:53:47 532

shiyan1-3.exe

shiyan1-3.exe

2023-05-15

空空如也

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

TA关注的人

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