自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第五十六天 第十一章:图论part06 108.冗余连接 109. 冗余连接II

判断删一个边之后是不是有向树: 将所有边的两端节点分别加入并查集,遇到要删除的边则跳过,如果遇到即将加入并查集的边的两端节点本来就在并查集了,说明构成了环。如果顺利将所有边的两端节点(除了要删除的边)加入了并查集,则说明删除该条边还是一个有向树。确定图中一定有了有向环,那么要找到需要删除的那条边: 将所有边的两端节点分别加入并查集,如果遇到即将加入并查集的边的两端节点 本来就在并查集了,说明构成了环。继续使用查并集的方法,如果两个元素是在一个集合,那么我们就输出,反之加入集合。

2024-07-31 14:57:06 295

原创 第五十五天 第十一章:图论part05 并查集理论基础 寻找存在的路径

根据上面模版来做,我们每输入一边,就判断两个节点是否在同一个集合,以及将不在同一集合的两个节点加入集合。

2024-07-30 17:18:44 153

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

主要是理解什么时候对周长加一,也就是该点为岛屿,并且上下左右其中一个为边界或者为水的时候。有向图,用邻接表来做,这题直接用广搜就为最后的答案。(注意有向图的遍历和写入)用一个数组来存放节点是否能到达。

2024-07-29 19:36:34 340

原创 第五十二天 第十一章:图论part03 101.孤岛的总面积 102.沉没孤岛 103.水流问题 104.建造最大岛屿

第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。一个比较直白的想法,其实就是遍历每个点,然后看这个点能不能同时到达第一组边界和第二组边界。1.我们先把边界上的岛屿以及与其相邻的岛屿都标记为0,再进行孤岛的数量求解。1.首先将同上,将边界及相邻的岛屿找到,此时变为2(因为还要复原);(相当于将孤岛排除)

2024-07-28 18:56:51 340

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

grid表示该位置是否为岛屿,vis表示该位置是否被标记过(遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。所以我们将符合条件的值加入到队列的同时,我们应该将其进行标记,即对应的vis标记为true;根本原因是只要加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再去标记走过。深搜广搜都可以,主要是记录下每个岛屿中小岛屿的个数,每个小岛屿面积都是1。其实就是求连通块的数量,理解两个容器的作用。两个二维容器的作用同上。

2024-07-27 10:28:26 436

原创 第五十天 第十一章:图论part01 图论理论基础 深搜理论基础 98. 所有可达路径 广搜理论基础

bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。注意图的输入形式,这里图用二维数组graph[s][t]表示,其中s,t表示s,t两点之间是否相连,相连赋值为1,不然为0。dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。了解邻接矩阵(*),度,邻接表(数组+链表)等 遍历顺序:深搜加广搜。后面深搜的方法和回溯三部曲几乎一样。

2024-07-25 20:40:59 564

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

我们先放第一个元素进去,放第二个元素时,就符合条件(比第一个元素小,也就是当前的栈顶元素),我们弹出栈顶元素,此时我们需要三个元素进行计算,也就是弹出的元素和左右两边比其小的元素,但此时栈里面没有元素了,因此我们在数组前面加个0,让其始终成为栈底元素,让计算一直持续下去。如果该柱子是单调递增的,我们放入栈中的元素就是单调递减的(从栈顶往栈底),那么我们永远也不可以使得栈里面的元素被弹出,也就是当前的元素一直都是大于栈顶元素的。因此我们要在数组末尾加个0,让栈里面的元素可以弹出,进行后续的计算。

2024-07-24 16:02:57 469

原创 第四十八天 第十章 单调栈part01 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

主要是要在nums2中查询nums1中元素的同时,要将nums1元素的下标保存。2.其实也可以不扩充nums,而是在遍历的过程中模拟走了两遍nums数组。这题要处理循环数组,也就是多次遍历数组。使用单调栈:注意栈中的递增递减顺序。1.两个nums数组拼接在一起。

2024-07-23 16:58:24 526

原创 第四十七天 第九章 动态规划part13 647. 回文子串 516.最长回文子序列

如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]相同,则那么dp[i][j] = dp[i + 1][j - 1] + 2;整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。在确定递推公式时,就要分析如下几种情况。

2024-07-23 09:18:26 346

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

例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];这里我将s,t遍历顺序改变了。

2024-07-20 23:50:55 407

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

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

2024-07-19 23:50:16 303

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

如果nums[i]<nums[i-1]时,我们的最长子序列将从头开始计算,然后同前面的最长子序列进行比较,取最大值。所以:if (nums[j] < nums[i]) dp[i] = max(dp[i], dp[j] + 1);dp[i][j]表示以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度为dp[i][j]。(每次我们的i是固定的,但是j是在变化的,dp[i]就是用来存位置为i时的最长子序列)我们考虑dp[i][j]时,要在dp[i-1][j-1]的基础上去计算。

2024-07-18 16:39:45 465

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

我们只要分清楚奇数表示我们为买入状态,偶数表示我们为卖出状态。四个状态:把不持有股票分为冷冻期和过了冷冻期并且不持有股票两种。第二种方法相当于把过了冷冻期并且不持有股票的状态看作是冷冻期。代码随想录里面分为了四个状态,其实三个状态也可以。这题和上面一题很像,但是我们的交易次数变为k。初始化可以带入递推公式去计算。和上面题的区别在于需要手续费。第一种方法有点不能理解。

2024-07-17 21:45:46 558

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

和上面唯一的不同就是 dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);同样dp[i][0]取最大的,dp[i][0] = max(dp[i - 1][0], prices[i] + dp[i - 1][1]);那么dp[i][1]应该选所得利润最大的,所以dp[i][1] = max(dp[i - 1][1], -prices[i]);第i-1天就持有股票,那么就保持现状,所得利润就是前一天持有股票的所得利润 即:dp[i - 1][1]

2024-07-16 20:33:22 232

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

2.有递推公式可知,我们要先定义前面两个值。dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);1.dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。3.首先明确的是使用后序遍历。1.终止条件:当root==NULL时,偷与不偷都是0,也相当于初始化。3.由于dp[i]是由前面两个推来的,所以遍历要从前到后。这道题目和上面那题是差不多的,唯一区别就是成环了。处理方法和上题差不多。

2024-07-15 22:21:49 601

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

【代码】第三十八天 第九章 动态规划part06 322. 零钱兑换 279.完全平方数 139.单词拆分。

2024-07-14 21:20:58 99

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

理解什么是完全背包。

2024-07-13 16:41:00 655

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

【代码】第三十六天 第九章 动态规划part04 1049. 最后一块石头的重量 II 494. 目标和 474.一和零。

2024-07-11 20:08:52 130

原创 第三十五天 第九章 动态规划part03 01背包问题 二维 01背包问题 一维 416. 分割等和子集

递推公式很难理解,动态规划过程没理解清楚。背包问题太难了,还没理解。

2024-07-10 23:22:47 213

原创 第三十四天 第九章 动态规划part02 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96.不同的二叉搜索树 (可跳过)

62,63主要是搞明白dp数组的含义。63题未注意在路径上出现障碍的情况。

2024-07-09 16:34:51 296

原创 第三十三天 第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

这题有很多种解法,这里按照动态规划的方法进行。

2024-07-09 01:09:11 113

原创 第三十一天 第八章 贪心算法 part05 56. 合并区间 738.单调递增的数字 968.监控二叉树 (可跳过)

这题太难了,根本想不到,多学习借鉴。从后往前的思路最重要。

2024-07-07 16:29:56 114

原创 第三十天 第八章 贪心算法 part04 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

思路:找到最远出现该字母的位置。主要理解范围区间划分。

2024-07-05 11:06:09 110

原创 第二十九天 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

两种情况讨论,(容量-消耗量)的累加和小于0时不可环绕一周,反之即可,同时如果当前容量-消耗量小于0,那么当前加油站也不是加油站,往后推一站,但是我们一定能找到一个加油站作为开始加油站环绕一圈。其中要注意一个细节,在进行反向比较时,res[i-1]=max(res[i]+1,res[i-1]);我们比相邻数目多的同时,还要同原本自己的数量相比,取较大的一个值。这题相对容易,但是要考虑到,如果顾客给的是20,我们要先考虑使用10+5的方式找零钱,而不是全使用5元的零钱。这题先考虑身高,再考虑位置。

2024-07-04 11:38:35 1666

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

将绝对值从大到小排序,先处理为负数的部分。若取反后k还大于0;将最小数进行取反,也就是对数组的最后一个元素取反。思路很重要:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。考虑局部最优,也就是相邻两天股票增,前一天就得买入。

2024-07-03 15:16:21 385

原创 第二十七天 第八章 贪心算法 part01 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。唯一的难点就是如何通过局部最优,推出整体最优。最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。

2024-07-02 20:57:15 386

原创 第二十六天 第七章 回溯算法 part04 491.递增子序列 46.全排列 47.全排列 II

将其看作一个二叉树,可以知道,在二叉树每层中,不能取相同的元素。这题最主要要理解这个点。使用unordered_set对其进行降重。2.去重一定要对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用了。但是我们要注意这题数组中可能出现相同的元素。这题最重要的是考虑一个数在一个排列中只能出现一次。

2024-07-01 21:33:57 898

原创 第二十四天 第七章 回溯算法part03 93.复原IP地址 78.子集 90.子集II

93.复原IP地址class Solution {private: vector<string> result;// 记录结果 // startIndex: 搜索的起始位置,pointNum:添加逗点的数量 void backtracking(string& s, int startIndex, int pointNum) { if (pointNum == 3) { // 逗点数量为3时,分隔结束 // 判断第

2024-06-30 11:29:17 121

原创 第二十三天 第七章 回溯算法part02 39. 组合总和 40.组合总和II 131.分割回文串

由于是元素可以重复被选,所以递归的时候我们的下标值就为当前的值,表示我们可以重复选取相同的元素。不能让每次递归的之都从数组的第一个元素开始,

2024-06-28 16:54:27 150

原创 第二十二天 第七章 回溯算法part01 77. 组合 216.组合总和III 17.电话号码的字母组合

记住递归三部曲以及回溯三部曲。注意for循环的终止条件,一般是结果的长度大小。要记得考虑输入字符为空的情况。同时考虑到其他异常情况,将其他按钮设置为空字符。学习到了一种提前定义映射的方法,方便我们的数值对应。和上面一题类似,主要是注意终止条件。

2024-06-27 21:45:38 151

原创 第二十一天 第六章 二叉树part08 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

理解二叉搜索树,合理运用其特征。移除节点步骤很重要,别忽视往上传节点的过程。使用类似双指针的方法,定义一个值去存储该节点下个节点的值。这题需要考虑的是找到分割点,数组大小为偶数时,可能出现两种情况。感觉二叉树太难了,后面每天都要复习。

2024-06-26 11:20:13 447

原创 第二十天 第六章 二叉树part07 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

2.正对于搜索二叉树(利用其性质)。两种方法: 1.对所有二叉树都可以使用。

2024-06-25 16:38:29 202

原创 第十九天 第六章 二叉树 part06 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

理解了用map来存放对应值存在的个数,但是没懂如何遍历出出现次数最多的值,并且众数不止一个。这题需要反复做,知识点多。也可以先放入数组,再统计,类似上题的做法。首先将二叉树(二叉搜索树,左边节点小于右边节点)的值输入到数组,使用中序,可以得到一个升序数组,再进行前后比较。从下往上遍历想到用后序遍历。

2024-06-24 22:32:22 127

原创 第十七天 第六章 二叉树 part05 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

刚开始做思路有问题,还分了不同的情况去处理。其实就创建一个根节点,将两个二叉树对应节点相加减。

2024-06-22 19:32:39 191

原创 第十六天 第六章 二叉树 part04 513.找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

保证优先左边搜索,然后记录深度最大的叶子节点,此时我们要的值就是树的最后一行最左边的值。这里要注意,我们的结果需要的是最后一行的最左边的值。所以要找到深度最大的叶子结点。

2024-06-21 22:52:32 218

原创 第十五天 第六章 二叉树part03 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

由于我们要找的是左叶子节点,所以要满足当前节点的左节点不为空,并且该节点为叶子节点,此时满足他为左叶子节点的条件。先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

2024-06-20 22:21:18 519

原创 第十四天 第六章 二叉树 part02 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

这题使用后序遍历,使用求高度的方法求深度。使用前序才是真正深度的求解方法(有点麻烦,不容易理解)。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点表示左右节点都不存在。所以需要判断左右节点是否都为空。这题就是单纯交换两个节点,可以直接写在原函数里面,调用原函数递归就行。上述都是使用递归的方法,后面要学习迭代法。有些题前序后序都可以做,也需要后面去学会。遍历左右节点,先排除左右分别为空以及不相等的情况,后面就可以进行递归了,104.二叉树的最大深度。111.二叉树的最小深度。

2024-06-19 22:12:44 169

原创 第十三天 第六章 二叉树part01 递归遍历 迭代遍历 层序遍历

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。前序:在加入栈时,左右分支的加入情况需要考虑清楚,因为中左右,所以需要先将中弹出,然后先加入右分支,再加入左分支。确定每一层递归需要处理的信息。这个基础很重要,很重要,很重要!

2024-06-18 23:17:47 206

原创 第十二天 第五章 栈与队列part02 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

这题要注意将字符串转化为数字来加减乘除。可以使用stoi将字符串变为数字。(自己写的代码一直报错,重新写后就没事了)。347.前 K 个高频元素 (有点难度,可能代码写不出来,一刷至少需要理解思路)今天理解其中的思路,明天回来巩固并且写一遍代码。并且总结其中的重点地方。今天理解其中的思路,明天回来巩固并且写一遍代码。并且总结其中的重点地方。上面这两个题很重要,要理解并且学会大小顶堆,优先级队列的定义和用法。239. 滑动窗口最大值 (有点难度,可能代码写不出来,但一刷。150. 逆波兰表达式求值。

2024-06-17 20:12:37 165

原创 第九天 第五章 栈与队列part01 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

这里忘记考虑栈为空的情况,栈为空,直接将字符放入栈中。另外在字符串赋值时,有两种办法:1.res.push_back(), 2.res=+ ' '.。这道题首先需要考虑所有能出现的情况。使用一个栈来存储后面会出现的配对的字符,一旦对应不上,就返回false。sta.empty()这个条件很重要,一旦栈为空,则说明此时的字符在前面找不到与之对应的字符。理解其中的的思路和步骤,但具体怎么写不清楚。

2024-06-16 18:22:20 156

空空如也

空空如也

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

TA关注的人

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