自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法学习 | day49/60 回文子串/最长回文子串

这里和之前动态规划类题目都不太一样,这个题目的dp数字的定义主要是考虑了回文这个结构的特殊性,直接看的答案解析,看懂了其实再来理解这个题目就不是很难了。动态规划转移的方程,重要的是要理解为什么这个转移的方向来自左下角,这也决定了后面的遍历顺序,必须是从i的最后面向前遍历,否则就会是没有填充的数值进行的递推。

2024-04-29 15:23:00 260

原创 算法学习 | day48/60 两个字符串的删除操作/编辑距离

一、题目打卡 1.1 两个字符串的删除操作 题目链接:. - 力扣(LeetCode)class Solution {public: int minDistance(string word1, string word2) { // 题目可以理解为,找到最大的长度的相同子序列 vector<vector<int>> dp(word1.size() + 1, vector<int>(word2

2024-04-26 11:19:13 244

原创 算法学习 | day47/60 判断子序列/不同的子序列

然后状态转移就分当前的两个序列当前值相等和不相等两种情况进行处理,其实这里相等,也可以像背包问题一样理解,也就是取用了这个数字,所以就不能从左和上面继续取值,此时就应该取左上角的状态转移过来,另一个情况则是不取用当前这个值,然后从状态的左边和上面转移而来。

2024-04-25 10:27:28 274

原创 算法学习 | day46/60 最长公共子序列/不相交的线/最大子序和

这个主要思路是理解清楚状态的定义,从 0 到 i 的所得到的连续子数组的最大和,这样的就可以看出,状态转移就会分为两个情况,如果之前的状态是正数,那么这一轮就可以继续进行累加,如果是dp数组的状态是负数了,那么就重置然后重新开始累加。这个题目和上面的那个题目是一样的,也就算是上面那个题目的一个实际的使用的描述形式。写的时候需要注意,如果是这种不需要初始化的情况,那么在进行nums1和nums2的比较的时候,就需要对索引进行减 1 的操作。

2024-04-23 20:13:22 394

原创 算法学习 | day45/60 最长递增子序列/最长连续递增序列/最长重复子数组

看到了一句评论,觉得总结的特别到位:以nums【i】为结尾的最长递增子序列的长度可以由 nums【0】为结尾的最长递增子序列长度、nums[1为结尾的最长长度、……nums【i-1】为结尾的最长长度比较得到。这里状态转移方程,需要一个比最大值的操作,因为存在第二层循环,其实也就是相当于第二次循环每次找到满足要求的,都进行相应的迭代。

2024-04-23 10:29:26 315

原创 算法学习 | day44/60 买卖股票的最佳时机含冷冻期/买卖股票的最佳时机含手续费

代码随想录总体的类型如上所示,内容的话可以参考上面发的那个链接。

2024-04-22 15:42:24 295

原创 算法学习 | day43/60 股票III/股票IV

我认为这个题目的关键在于理解这个持有和未持有,以及为什么一定需要声明一个什么都不做的状态。但是为了整齐或是代码美观,然后这样写的吧。

2024-04-22 09:48:42 118

原创 算法学习 | day42/60 买股票的最佳时机/买股票的最佳时机

因为题目要求的是最终只有一次股票的买入和卖出,所以其实最直接的思想就是遍历整个prices,然后从当前节点之前取最小,当前节点之后取最大,然后在遍历的过程中,记录下来两者相减的最大值,也就是最终的结果,但是这样是 n^2 的时间复杂度,因而肯定最终通过不了,这里有一个小的tips我这个方法获得的是迭代器,需要进行取值的操作。

2024-04-17 09:46:31 324

原创 算法学习 | day41/60 打家截舍/打家劫舍II/打家劫舍III

感觉如果从之前的背包问题过过渡到这个题目的话,就不是很难理解,状态变量——从0 到 i 所得到的最大价值,递推公式,是否选择索引所对应的价值,和背包问题很类似,题目的原型感觉比背包问题更好理解,不够题目应该还有不同的变种,继续看还会有什么样的变化。

2024-04-15 15:39:46 353

原创 算法学习 | day40/60 单词拆分/多重背包/背包问题总结

代码随想录在讲解背包问题的时候,都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了。而且每一个点,我都给出了对应的力扣题目。最后如果你想了解多重背包,可以看这篇动态规划:关于多重背包,你该了解这些!

2024-04-12 11:33:48 659

原创 算法学习 | day39/60 爬楼梯/零钱兑换/完全平方数

这个递推的一个思想就是在最终目标点前面的m个步长以内,可以一步到达,所以方法累加就相当于是这个m个步长中所有的方法的总和,或者是思考为背包问题,因为每次走的步数都是从 1 开始到 m 的,因而就变成了一个完全背包问题。

2024-04-11 15:28:06 245

原创 算法学习 | day38/60 零钱兑换/组合总和IV

今天主要是完全背包的一个专题,完全背包相对于 01 背包,主要区别在于物品可以取出无限次,其他关于 dp 的状态定义和状态转移都是一样的,体现在代码上,最重要的是遍历的一个先后顺序以及遍历开始的位置。

2024-04-10 15:34:00 291

原创 算法学习 | day37/60 最后一块石头的重量 II/目标和/一和零

这个重点在于理解题意,只要能明白最终题目需要做到的事情是分割所有的石头成两堆,让两边尽可能相等这一点,就和之前写的题目联系起来了。

2024-04-09 15:58:08 774

原创 算法学习 | day36/60 背包问题/分割等和子集

先看了视频再做的,思路相对清楚了很多,我感觉这个题目递归的过程不是很复杂,反而不好理解的是这个状态的定义,还有就是写的过程中,这个索引用着的感觉也有点奇怪,但是我说不清楚,还是写一个案例自己分析一下比较好,然后就是注意一下,本身在递推的过程中,我忽略的一个情况,就是当前的物品重量肯定放不进的情况,还有就是dp[i-1][j-weight],这个地方的j,我写成的bagWeight,这样就没有递推的过程了。

2024-04-08 15:35:48 355

原创 算法学习 | day35/60 整数拆分/不同的二叉搜索树

状态的定义还是比较清楚的,主要是卡在了状态转移方程上,主要的思想是分了两种进行比较:一种是分为两个数相乘,另一个是三个及三个以上相乘,前面的那个完成的方法是通过两层递归进行枚举,后者则是递推的一个关键,三个及三个以上,其实就是两个中固定一个,然后拆分另一个,而这个拆分的结果,就是由前面的内容递推而来的。

2024-04-07 23:24:58 287

原创 算法学习 | day34/60 不同路径/不同路径II

拿到手,首先见到答案需要求的是种类的个数,并且看题目,每次移动的时候只有两个方向,这也就说明,对于某一个位置来说,其状态转移的方向来自两个方向,上和左,并且看题,这个题目要求的是总共有多少路径,所以状态应该就是走到当前这个格子一共有多少路径。(最后看了答案发现我写的有点不对,第一个那个位置应该是1)我承认比答案写的冗余的多,但是我思路是没问题的😂。

2024-04-03 20:34:19 428

原创 算法学习 | day33/60 斐波那契数列/爬楼梯/使用最小花费爬楼梯

题目本身把初始化和递推公式都给出了,所以题目不难,需要注意的是初始化的数值,还有索引和对应数列的处理,因为这样的输出方式,是加了一个前缀 0 的,所以最终遍历和最终返回的时候需要考虑到这一点,等于是步长要向后移动一个单位。

2024-04-03 18:57:54 174

原创 算法学习 | day32/60 单调递增的数字/监视二叉树

这个题目我想了两种暴力的解法,最简单的思想肯定是不断减 n,直到找到合适的,对于这个减 n 的方法,最粗暴的肯定是每次减1 ,但是不出所料超时,然后我考虑了一种,统计出现不满足递增数字的位置,然后从这个位置开始递减,但是我发现这样其实也会超时,所以看了答案的解法。答案的思想还是比较巧妙的,我认为理解主要分为两个方面,首先是相邻位置被标记不满足递增条件的位置,其实对于后面那一位来说,直接更新为 9 就可以了,因为这样不管递推到多少步,始终都是满足递增的条件的;

2024-04-02 15:17:22 324

原创 算法学习 | day31/60 无重叠区间/划分字母区间/合并区间

题目过程还是比较好理解的,主要是这里需要注意对于我这种写法来说,处理right的时候,遇到第二种情况的时候,记得需要去去除的区间应该是更大的那个区间,所以需要进行 min 操作。

2024-04-01 14:38:14 340

原创 算法学习 | day30/60 柠檬水找零/根据身高重建队列/用最少数量的箭引爆气球

模拟收银台的方式进行找零,这样不过多浪费了一些空间,但是思路还是很清楚的,从最大的向最小的开始找零。

2024-03-30 15:48:46 175

原创 算法学习 | day29/60 K次取反后最大化的数组和/加油站/分发糖果

整体的思路是,先进行排序,然后在 k 次数大于0的情况下,尽可能多的去取反绝对值比较大的负数,如果没有负数了,并且反转的次数也还没有用完,那就再次进行扭转,这时候就一直反转最小的正数或者是0就行了。

2024-03-30 10:53:57 254

原创 算法学习 | day28/60 买卖股票的最佳时机/跳跃游戏/跳跃游戏II

好好好,我专门考虑记录波峰波谷,结果案例过不去,然后突然醒悟,如果是贪心全部加上正区间不就可以了,然后发现确实是,我只能说,确实挺贪心的,这样等于是买了,只要是正的第二天就卖。

2024-03-28 15:23:14 271

原创 算法学习 | day27/60 分发饼干/摆动序列/最大子序和

题目本事不难,我考虑的时候复杂了,但是思路是没有太大问题。

2024-03-28 10:04:00 301

原创 算法学习 | day26/60 重新安排行程/N皇后/解数独

今天是3道难题,主要还是自己尝试,但是确实难题的细节比之前的题目要多得多,做的过程很波折。

2024-03-27 18:43:13 637

原创 算法学习 | day25/60 递增子序列/全排列/全排列II

这个题目写的过程中表明的坑我好像都踩了(擦汗.jpg),这个题目类似与子集,但是根据题目的要求,这个题目并不能排序,这个题目的去重过程也和之前的不一样,因为没有办法排序,那么在同一层中,就不能使用之前我写的那个条件进行判断了,然后我看了答案,确实解锁了一种新的思路,通过set来存储在同一层(横向)中重复的元素并进行判断,相当于是用空间换时间的一种方法吧,之前的算法,因为可以排序,所以其实节省了这里的一部分空间。

2024-03-25 15:36:46 743

原创 算法学习 | day24/60 复原IP地址/子集/子集II

思路其实和分割回文那个题目差不多,但是我了一些评论区的答案,感觉写的更简洁一点,但是我不想再优化了(摆烂.jpg)。

2024-03-21 11:21:44 269

原创 算法学习 | day23/60 组合总和/组合总和II/分割回文串

本身题目给的就是有序的数组,所以不用额外排序了,这个相比较之前的组合问题,唯一的不同是,在下一层传递过程中的 startIndex 是包含本层起始位置本身的。

2024-03-20 15:33:40 756

原创 算法学习 | day22/60 组合III/电话号码的字母组合

这个题目本质上也是之前讲过的回溯模板,只是这里需要增加一个哈希的映射来处理不同的数字和字符串的对应,然后觉得这种类型题目不好理解的时候可以画一个 n 叉树来帮助理解,对这个题目而言,n 叉树的子树代表了这一层数组不同索引的值,而递归的深度代表的是一开始digit 的大小,整体来看就是每层树的 root 取一个值,直到path的size满足要求。

2024-03-19 15:38:59 181

原创 算法学习 | day21/60 回溯算法理论基础/组合

回溯算法一般用来解决组合、分割、子集、排列、棋盘问题等:回溯法也可以叫做回溯搜索法,它是一种搜索的方式,回溯是递归的副产品,只要有递归就会有回溯。,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。因为回溯法解决的都是在集合中递归查找子集,。

2024-03-19 11:13:49 343

原创 算法学习 | day20/60 修剪二叉树/将有序数组转成二叉搜索树/把二叉树转成累加树/二叉树总结

代码随想录在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,Carl给大家大体分分类。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径(opens new window)也用了前序,这是为了方便让父节点指向子节点。

2024-03-18 14:52:16 858

原创 算法学习 | day19/60 二叉搜索树的最近公共祖先/二叉搜索树中的插入操作/删除二叉搜索树中的节点

这个题目同样利用了二叉搜索树的特性,比较关键的一个点就是公共祖先一定在 p 和 q 的val 的中间,而由这一点去由上向下找到的第一个满足条件的祖先,肯定就是需要找到的那个,因为此时深度肯定是最大的,题目本身也利用的剪枝的特点。

2024-03-16 19:59:19 394 1

原创 算法学习 | day18/60 二叉搜索树的最小绝对差/二叉搜索树中的众数/二叉树的最近公共祖先

这样的判断肯定是不对的,因为我本身想的是如果检测到了 p 或者 q ,那就返回true,但是这时候有一个问题,最后在 “中” 返回的,应该是 && 还是 || ,这里可以发现,在这个根节点的左右,应该是返回 && ,但是在这个下面的节点,应该返回的是 || ,否则这时候收到的肯定是 false,也就是这个判断的逻辑其实是应该分开处理的,但是我那时候没想想清楚如何做区分。

2024-03-15 19:42:16 327 1

原创 算法学习 | day17/60 最大二叉树/合并二叉树/二叉搜索树的搜索/验证二叉搜索树

递归的思想,使用双指针不断分割整个数组,由于我使用的是左闭右闭区间,因而结束的条件是右指针小于左指针,而对于每一个区间,构造的递归的子问题是:找到这个区间中的最大值所对应的索引(指针),并以这个节点构造树的节点,接着进入递归,直到区间为空。这里需要注意的是由于我使用的是闭区间,因而在自己构造的函数 get_max 中,注意 for 循环的结束条件。

2024-03-14 16:13:09 339

原创 算法学习 | day16/60 找树左下角的值/路径总和/从中序和后序遍历序列构造二叉树

层序遍历属于固定的写法,没有很特别的。看了答案,如果按照递归写,稍微的绕一点,主要是在每一层需要维护一个额外的递归的深度,并且注意终止的条件是遇到的第一个叶子节点,因为这里递归的开始是向左,所以遇到的第一个终止的节点一定是本层的最左边的节点。

2024-03-14 11:18:52 765

原创 算法学习 | day15/60 平衡二叉树/二叉树的所有路径/二叉树的所有路径

看了答案,答案采用的是后序遍历的方式,我感觉比较抽象一点,我还是习惯用这种整体的方式,然后采用前序遍历的方式,感觉比较直观。

2024-03-12 16:05:56 364 1

原创 算法学习 | day14/60 二叉树最大深度(迭代)/二叉树最小深度(迭代)/完全二叉树节点个数

递归的方法比较直观,将这个问题看作是子问题,每一个子问题是返回两个子树中最大的深度,注意一下终止条件和返回上一层的加 1 操作。迭代的方法其实也比较直观,模拟的入队列和队列的过程,其实就是统计层序遍历最后返回值中容器大小。

2024-03-11 11:14:58 299

原创 算法学习 | day13/60 二叉树层序遍历/翻转二叉树/对称二叉树

思考这个问题的时候,也应该把一个单独的位置拿出来进行思考,就是一个三角的小结构,分析这个问题,也可以把整个大问题分为小问题:左子树的最小深度和右子树的最小深度,而需要返回的是应该是这两个值的最小值(在两边都存在的时候),如果有一边不存在,那么应该返回的是存在的那一边的数值,最后一种情况就是叶子节点,这时候直接返回 0 就可以了。本身在第二个while循环的逻辑进行处理就可以,随时更新最大值的大小,不过时间原因,直接复用的之前的代码,并使用 max_element 方法直接返回。

2024-03-11 11:11:22 846

原创 算法学习 | day12/60 二叉树理论/递归遍历/迭代遍历/统一迭代

以下的理论知识和图都来自于代码随想录。 对于多数题目来讲,二叉树主要分为满二叉树和完全二叉树。 满二叉树是指一棵二叉树只有度为 0 和度为 2 的节点,并且度为 0 的节点在同一层上,那么这个二叉树被称作是满二叉树: 完全二叉树 完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。 二叉搜索树

2024-03-10 10:44:29 817 1

原创 算法学习 | day11/60 滑动窗口最大值/前 K 个高频元素/栈总结(复习了谓词、lambda和运算符重载)

首先,在 C++ 中,常用的 stack 和 queue 并不是容器,而是容器适配器,其内部的内存是否连续取决于所使用的底层数据结构是什么样的,在默认缺省的情况下,底层使用的是 deque ,那么它就是不连续的。栈在底层的操作系统中也存在很广泛的应用,比如编译器处理括号、目录指令、递归等。对于题目而言,括号匹配、字符串去重、逆波兰表达式等都是经典的栈应用;

2024-03-08 14:48:53 776 1

原创 算法学习 | day10/60 有效的括号/删除字符串中的所有相邻重复项/逆波兰表达式求值

题目本身不难,主要理解栈在括号匹配时候的思路,而针对类似输入为 ']' 的情况,需要注意在所有的判断语句中都要加上判断是否为空的语句,否则可能会导致未定义的行为,最后为了防止输入的内容全部都是左括号,还需要改进最后返回的条件为 input.empty();

2024-03-07 10:47:26 338

空空如也

空空如也

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

TA关注的人

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