自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第七十天 | 108.冗余连接、109.冗余连接||

已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了。节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。情况三: 如果没有入度为2的点,说明 图中有环了(注意是有向环)剩下的图论算法等年底出了视频后再做,已经看不懂文字版了。删1 -> 3或者2 -> 3即可。情况2:只能删特定的一条边。

2024-06-25 20:32:26 671 1

原创 代码随想录算法训练营第六十九天 | 并查集理论基础、寻找存在的路径

题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。

2024-06-25 20:00:19 289

原创 代码随想录算法训练营第六十七天 | 字符串接龙、有向图的完全可达性、岛屿的周长

我们本题需要三个,一个是图,一个是当前遍历的节点,此外还需要一个一维数组来记录我们是否访问过。因为有一对相邻两个陆地,边的总数就要减2,如图红线部分,有两个陆地相邻,总边数就要减2。我们这里本不需要回溯,我们只需要判断节点是否都被遍历过即可,并非找出所有可行路径。本题只需要求出最短路径的长度就可以了(想到广搜),不用找出具体路径。只能用深搜(DFS)或者广搜(BFS)来搜。判断点与点之间的关系,需要判断是不是差一个字符,计算出总的岛屿数量,总的变数为:岛屿数量 * 4。然后就是求起点和终点的最短路径长度,

2024-06-22 12:22:39 528

原创 代码随想录算法训练营第六十六天 |101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。思路一:遍历每个点,去看是否能到达两个边界,但这样肯定超时,遍历每个节点是m*n的复杂度,而深搜每个节点又是m*n的复杂度。时间复杂度:O(n^2)

2024-06-21 14:26:01 552

原创 代码随想录算法训练营第六十五天 | 岛屿数量 深搜、岛屿数量 广搜、岛屿的最大面积

本题思路,是遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。本题已经说明,只有水平方向和竖直方向才能组成岛屿。与上两题一样的思路,这里使用广搜。

2024-06-20 14:43:55 660

原创 代码随想录算法训练营第六十四天 | 图论理论基础、深搜理论基础、广搜理论基础、98. 所有可达路径

我写在了个人语雀笔记中。

2024-06-19 21:05:28 717

原创 代码随想录算法训练营第六十三天 | 42. 接雨水、84.柱状图中最大的矩形

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left,因为空栈我们不做处理,因此就跳过了。应该是从栈头到栈底,是从小到大的,因为一旦发现更大的了,就出现凹槽了,栈头左边第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。遍历的是5,左边是1,比它小,无法扩展,右边是6,比它大,可以扩展,面积为5*2。因为要找的是第一个比它小的,因此从栈顶到栈底是从大到小的,递减的。1.使用单调栈内元素的顺序。

2024-06-18 11:52:15 801

原创 代码随想录算法训练营第六十二天 | 739.每日温度、496.下一个更大元素 I、503.下一个更大元素II

我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。4.本题要找第一个大的,因此用递增栈。加入T[2],同理,T[1]弹出。

2024-06-16 12:55:40 853

原创 代码随想录算法训练营第六十天 | 647. 回文子串、516.最长回文子序列

1.dp[i][j] [i,j]子串是否是回文的 是则返回true,不是则返回false2.递推公式if(s[i] == s[j]) 1.i==j 指向同一个元素,那么是回文子串 { if(j-i<=1) {dp[i][j] =true; result +=1} 2.i,j相差1 aa 也是回文子串 else if(dp[i+1][j-1]==true) {dp[i][j] =

2024-06-15 11:20:10 398

原创 代码随想录算法训练营第五十九天 | 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

代码随想录。

2024-06-14 11:57:58 967

原创 代码随想录算法训练营第五十八天 | 392.判断子序列

else dp[i][j] = dp[i][j-1] //如果不相同,那么就删除t字符串这个当前字符,去判断j-1之前的字符串。2. if(s[i-1] == t[j-1] ) dp[i][j] = dp[i-1][j-1] + 1 //应该是s和t的前一面一段的相同子序列的长度加一。1.dp[i][j] 以i-1为结尾的字符串s,以j-1为结尾的字符串t的相同子序列的长度(方便初始化)我们是从左上方和左方推导而来。

2024-06-13 11:26:53 690

原创 代码随想录算法训练营第五十七天 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

if(nums[i-1]==nums[j-1]) dp[i][j] = dp[i-1][j-1]+1 //如果相同,则同时回退。要么是前面的都不要了,就拿自身,要么就延续前面的。1.dp[i][j] 以i-1结尾的nums1,和以j-1结尾的nums2的最长公共子序列。1.dp[i] 以nums[i]为结尾的最大连续子数组的和。这题和最长重复子数组的区别就是:这题并不是连续的。dp[i][0] dp[0][j]都是0。

2024-06-12 16:58:01 501

原创 代码随想录算法训练营第五十六天 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

2.dp[i] = max(dp[j]+1 , dp[i]) dp[j]题目并没有要求连续 dp[j]是遍历了前面每一个元素的一个最长递增子序列。2. if(nums[i-1]==nums[j-1]) dp[i][j] = dp[i-1][j-1] + 1 同时进行回退。3.初始化 dp[i][0] = 0;1.dp[i] 以nums[i]为结尾的最长递增子序列的长度。1.dp[i] 以i为结尾的最长连续递增子序列为dp[i]4.遍历循序都是从1开始。

2024-06-11 11:43:06 351

原创 代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

代码随想录。

2024-06-08 11:20:34 362

原创 代码随想录算法训练营第五十二天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

1. dp[i][0] 第i天不操作 dp[i][1]第一次持有股票(可能延续了前一次买卖的状态) dp[i][2]第一次不持股票 dp[i][3] 第二次持有 dp[i][4]第二次不持有。第二次持有 dp[i][3] = max (dp[i-1][3] , dp[i-1][2] - prices[i] ) 可以由前一天第二次不持有推得,也可以由前一天第二次不持有再买入。

2024-06-07 11:10:41 420

原创 代码随想录算法训练营第五十一天 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

dp[i][0] = max( dp[i-1][0], ) 前者是i-1持股,后者与买入股票1的区别就是,手头是第一次买,现金为0,而这题则是前一天不持股的现金(前面多次买卖的利润) - prices[1] (只能有一支股票)dp[i][0] 第i天持有这支股票的最大现金(不一定买) dp[i][1] 第i天不持有这支股票的最大现金(不一定卖),(手上的钱)如果在第i卖了这支股票 dp[i-1][0] + prices[i] 那么就是第i-1天持股时卖了,加上现金。

2024-06-06 11:31:34 438

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

1.dp含义 dp[0]表示不偷的最大金钱,dp[1]表示偷的最大金钱,那么每个节点就会有一个vector<int> nodeDp{不偷,偷}dp[1] = max(nums[0],nums[1]) 不一定非得偷1,偷这两个房间其中一个的最大值(根据定义)偷i:dp[i-2] + nums[i] (i-2之前是考虑范围)1. dp[i] 考虑下标i(包含),能偷的最大金币是dp[i]不偷i:dp[i-1] (i-1之前是考虑范围),不一定非要偷。情况2:考虑头不考虑尾。

2024-06-05 12:22:32 568

原创 代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

代码随想录。

2024-06-04 11:44:17 213

原创 代码随想录算法训练营第四十八天 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

dp[j] = min(dp[j - coins[i] ] + 1 , dp[j] ) 取一个最小的,这个背包问题的典型递推公式是很像的。完全背包,且是排列,21和12是不同的方法,因为先遍历背包,再遍历物品,且都是正序。下标非0的dp[i]初始化为0,因为dp[i]是靠dp[i-j]累计上来的。求的是最小值,因此min(dp[j] , dp[j - i*i] + 1)1. dp[j] 装满容量为j 的正整数的最少完全平方数是dp[j]1. dp[j] 装满容量为j的背包,最少物品为dp[j]

2024-06-03 20:42:19 584

原创 代码随想录算法训练营第四十六天 | 完全背包理论基础、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全和01背包的区别:物品的数量是无数个,因此在01背包中遍历背包时,正序遍历即可,这样就是用的这一行已经修改过的数据,因此正序,而倒序遍历时,左边都是上一行的状态,因此只添加了一次,是01背包两层for循环可以颠倒(仅限纯完全背包),排列和组合是不一样的遍历物品在外层循环,遍历背包容量在内层循环,状态如图:遍历背包容量在外层循环,遍历物品在内层循环,状态如图:因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。

2024-06-01 12:16:54 476

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

2. dp[i][j] = max( dp[i-x][j-y] + 1 , dp[i][j] ) 重量就是x个0,y个1 , 价值就是个数。那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。1.dp[i][j] i个0,j个1, 最大背多少个物品。1. dp[j] 背包容量为j所背的最大价值。1.dp[j] 容量为j的背包有多少种方法。例如:dp[j],j 为5,

2024-05-31 12:30:14 1084

原创 代码随想录算法训练营第四十四天 | 01背包问题 二维、 01背包问题 一维、416. 分割等和子集

1.dp数组定义dp[i][j] 下标为[0,i]之间的物品,任取放容量为j的背包的最大价值2.递推公式不放物品i: dp[i-1][j] 去看是否放i-1,还是有j的容量给i-1去放放物品i : dp[i-1][j-weight[i]] + value[i],放了物品i,那么就只有j-weight[i]的容量给i-1个物品去放了,同时要加上我这个物体的价值dp[i][j] = max(上面两个),取最大价值3.数组初始化。

2024-05-30 16:24:54 1068

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

4.遍历顺序从i=3开始遍历,直接到n,而j只需要遍历到i/2即可,因为乘积最大只会出现在数尽可能相同的情况下。2.例如以j为头结点,左子树有j-1个节点,右子树有i-j个节点,一共是i个节点(二叉搜索树的特性)dp[i] += dp[j-1] * dp[i-j] 不同头结点的情况是相加起来的。一个是j * dp[i - j],相当于是拆分(i - j),拆为三个或以上。1.dp[i] 表示 i为节点个数,dp[i]表示有多少个二叉搜索树。1. dp[i]对i进行拆分,得到的最大的乘积为dp[i]

2024-05-29 13:22:31 352

原创 代码随想录算法训练营第四十二天 | 62.不同路径、63. 不同路径 II

3.初始化,第0行和第0列要初始化,因为其他的都是由左和上方向相加而来的,同时有障碍物的话,从0到障碍物的位置赋值为1即可 , 遇到障碍物直接终止,2. ij可以由i-1,j往右走一步,或者i,j-1往想下走一步,但这里可能有障碍物,因此只需要加一个条件即可。3.初始化,第0行和第0列要初始化,因为其他的都是由左和上方向相加而来的。2. ij可以由i-1,j往右走一步,或者i,j-1往想下走一步,因此。1.dp[i][j]表示从00走到ij有多少种方式。1.dp[i][j]表示从00走到ij有多少种方式。

2024-05-28 13:07:38 1078

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

2. dp[i]可以由dp[i-1]+ cost[i-1]和dp[i-2] + cost[i-2]得到,取最小值即可。3.dp数组如何初始化 dp[0] = 1 , dp[1] = 1。2. 根据分析 dp[i] = dp[i-1] + dp[i-2]2.递推公式,dp[i] = dp[i-1] + dp[i-2]1.确定dp[i]含义, dp[i]表示第i个斐波那契数的值。1.dp[i] 表示到达第i个台阶所消耗的最少体力。1.dp[i] 达到第i阶楼梯有dp[i]种方法。3.初始化 d[1] = 1。

2024-05-27 12:35:06 817

原创 代码随想录算法训练营第三十九天 | 738.单调递增的数字、968.监控二叉树 (可以跳过)

代码随想录。

2024-05-25 11:45:33 291

原创 代码随想录算法训练营第三十八天 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

这里巧妙的一个点,就是直接修改结果中的最后一个元素的右边界,节省了一些时间和空间,因为结果集中最后一个元素的左边界肯定是小的(已经排序过了)即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。和之前的重叠区间的思路是一模一样的,只是处理逻辑不同而已,也是尽量让重叠区间在一起。重叠区间类的题目,基本都是一样的,还是比较简单的。在遍历的过程中相当于是要找每一个字母的边界,

2024-05-23 21:17:13 610

原创 代码随想录算法训练营第三十七天 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

我们在上述重叠的情况下,更新i的右边界即可,右区间取最小右边界,为什么要更新i呢?空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。往前插入时,后面的都是没有比前面高的,所以后面的随便往前差,都不会影响k,因此插入位置就是为k。2.1第i个气球左边界大于第i-1个气球的右边界,那么这两个一定不重叠,弓箭数++2.2第i个气球左边界小于等于第i-1个气球的右边界,那么这两个气球一定重叠。如果我们按照身高h来排序,从高到底排,那么前面的人一定比自身的高,h的维度已经确定。

2024-05-23 12:24:47 416

原创 代码随想录算法训练营第三十六天 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。我们用一个curSum来取累加剩余油,只要加的为负数之后,就说明i下标之前的所有站点都不适合做起始站点,选取i+1作为起始站点。这里取较大值,因为可能我比左边孩子大的数,比右边大的还要大,就取较大的。全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。,这样最大的负数都会在前面。

2024-05-22 12:21:28 633

原创 代码随想录算法训练营第三十五天 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点,假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。那我们只需要当利润为正数时去买卖即可,因为只有正数才会对总利润产生正向效果。本题的思路:我们的最终利润是可以分成每天的利润去看的,

2024-05-21 12:10:40 317

原创 代码随想录算法训练营第三十四天 | 理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

情况三:单调坡中有平坡这种情况就会出现错误,如果pre一直跟着cur,所以会多一个,因此我们只需要将遇到摆动后,记录一下坡的方向就可以了,不需要实时更新。

2024-05-20 12:41:15 798

原创 代码随想录算法训练营第三十二天 | 332.重新安排行程(可跳过)、51. N皇后(可跳过)、37. 解数独(可跳过),回溯总结

三道题跳两道,做一下N皇后,剩下两道等60天结束后再看,目前跳过的还有字符串的KMP算法。

2024-05-17 21:34:08 406

原创 代码随想录算法训练营第三十一天 | 491.递增子序列、46.全排列、47.全排列 II

图上也可以看出,我们是每层的每个节点来收集结果的,但是第一层不需要收集,因为元素要求大于等于2个。

2024-05-17 12:34:04 1076

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

这题的思路和子集没什么差别,主要是多了一个去重的操作,我们对于去重的操作都是先排序,然后利用used数组来判断是树枝去重还是树层去重,记得used数组要初始化。终止条件:用pointSum来终止,也就是逗点的数量,如果等于3了,说明已经切割完成了,此时去判断一下最后一个区间即可,细节在代码中已经标注。这道题其实本质和组合没有区别,唯一的不同就在于我们收集结果的位置,组合是在叶子节点收集,而子集则是在每个节点都要收集。本题和切割子串还是很相似的,但是细节上有所不同。

2024-05-16 17:53:23 412

原创 代码随想录算法训练营第二十九天 | 39. 组合总和、40.组合总和II、131.分割回文串

这题的去重逻辑,其实和三数之和很像,我们排完序后,在树枝上,我们取重复元素是可以的,但是在树层,在遇到相同的,也就是已经走过的路了,那就不要再走了,直接剪枝就可以了,但是。这里我们进行切割的话,是使用startIndex来进行标记的,而在横向的切割中,是用i去寻找下一个切割点的,因此我们截取字符串也是从[stratIndex,i]去截取的。而这题,我们只需要将数组排序后,例如235,和为4,当2+3已经大于4了,就没必要去遍历5了,因此在for循环中多加个判断条件即可。本题主要要理解的是如何画树形结构。

2024-05-15 19:14:37 555

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

const string& 是const引用传递,不会产生副本,也不会改变原来参数的值。其次就是注意逻辑的处理即可,详情见代码,本题也不需要剪枝,因为就是需要所有的可能性。剪枝操作也是一样的,首先剪深度,当和已经大于要求的和,那么就不需要继续深入了。这题回溯的深度,是由元素的个数决定的,这题的宽度,是由对应关系个数确定的。整体的思路和77题是一样的,这里只是多加了个一个和的判断。&引用传递不会产生副本,直接会修改原来参数的值,传入的是地址。值传递,会产生副本,不会修改原来参数的值。这题比较关键的一个点是。

2024-05-14 12:52:13 587

原创 代码随想录算法训练营第二十七天 | 回溯算法理论基础、77. 组合

回溯算法本质就是穷举,加上一些剪枝操作,但不是什么高效的算法。有递归就会有回溯,同时一层递归就是一层for循环。

2024-05-13 12:20:26 331

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

代码随想录。

2024-05-11 12:40:20 328

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

左不空,右不空 (左右孩子都可以上位,选右孩子,就把左子树移到右孩子的最左侧节点的下面即可)如果p在左边,q在右边,那么他们相交的节点就是最近祖先,因为从上往下搜索,所以直接return。p和q,如果都小于当前节点,那么就去左子树搜素,如果p和q都大于当前节点就去搜索右子树。对于二叉搜索树来说,迭代法一般比较简单,因为搜索树已经帮我们确定好了搜索顺序。终止条件就是要找到要删的节点,随后去处理逻辑。叶子节点,左空右空 (直接删)没有找到删除节点 (直接返回)左不空,右空 (左孩子上位)

2024-05-10 12:40:37 490

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

530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差。

2024-05-09 12:48:59 526

空空如也

空空如也

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

TA关注的人

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