自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

相等:因为 ij代表的是长度,则很自然的,如果想表达前 2 个元素,比对的当前第2个元素下标是1,所以当相等,也就是 text1[i-1] == text2[j-1]的时候,那么此时当前dp[i][[j] 位置因为其相同,则一定能够在原先 dp[i-1][j-1]的基础上+1.初始化也很重要,首先是dp[0],从0下标开始,则其值肯定就是nums[0]的值,而res初始化也得是0下标的值,以防万一一直就是负数,如果初始是0的话,0一直大于负数,但是其真正的最大值也就是负数,会导致出问题。

2024-03-07 22:51:19 283

原创 Day 27[补档] |● 39. 组合总和● 40.组合总和II● 131.分割回文串

在上面需要明确一个点,原始的 st 一直是头部,而流动的 i 则是用来改变切割的长度,当然切割也不是真的切割, substr 只是截取,sub(i,len)从i截取len长度的字符串。used数组的初次使用,主要就是用来去重,当同一数层时候,前面相同的为0,表示之前用过,则跳过当前,若前面相同且bool为1,代表在递归中,其虽然相同但是还是在结果的获取中,不能跳过。而最开始写错的,将func放进 if为ture里,其实根本没必要,因为如果为false,就continue,也根本不会进入递归。

2024-03-06 10:15:28 147

原创 Day 50[补档] |● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

第i天第一次卖出的状态要么是在i-1天之前已经卖出了,而这个状态一直持续到现在,或者是选择第i天将股票卖出,而当天卖出前提是我已经持有此股票,则状态只能是由i-1天以前一直持有此股票,即状态1的情况下,再卖出此股票即加上当前时刻股票价格即可。第i天第一次持有股票的状态来源要么是前i-1天就已经持有股票的状态,要么则是第i天买入股票,那么此状态只能通过前i-1天无操作才能得来。既然是2次买卖,则根据状态的延续,会存在上述5个状态(虽然关于0状态没必要单独写,只是为了好理解)。

2024-03-05 10:53:33 281

原创 Day 48[补档] |● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

具体思路已经在代码上表示,需要关注的一个点事,dp[i1]那里, dp[i][1] = max(dp[i-1][1], - prices[i]),后面的price[i]最开始我加上了 dp[i-1][0],习惯性,但是如果加上的话就不是只允许买卖一次了,所以如果表示买入,则直接取在i-1天就买入的状态或者当天买入的状态里取最大值,因为是负数,则最大值对应的就是绝对值的最小值。其实这题的答案,就是我最上面那一题最开始写错的方法,因为上一题只买卖一次,则当天买入的状态不存在上一个状态的影响;

2024-03-05 10:42:21 169

原创 Day 25[补档] |● 216.组合总和III● 17.电话号码的字母组合

既然搞清楚每一层代表什么,那么for遍历数层遍历的就是当前数字下的所有字符,而递归递的就是下一个数字的字符串,一层层往下直到return。先找边界条件,当子答案vector的数量达到k时候,就需要对其进行检测了,要么其符合n加入答案,要么其不等于n,也要退出。首先是通过一个vector映射每个数字对应的string,其可看作是一个二维数组。之后搞清楚每一层递归,每一层是什么东西。而下面回溯就比较常规,因为不选相同的元素,则后续递归过程,每次的st值是从当前遍历i的下一个开始.216.组合总和III。

2024-03-04 19:40:01 221

原创 Day 23 | ● 77. 组合

初见回溯,搞清楚套路就好些很多了。

2024-02-04 22:46:36 112

原创 Day 24 | ● 216.组合总和III● 17.电话号码的字母组合

剪枝的话可以再每次进循环的时候,判断一下上层递归的sum是否已经大于了目标和,如果已经大于了,则就直接return,不需要遍历。首先是当path里添加k个数字后就开始判断,如果sum和目标n相等,说明是一个合理的答案,添加进res总答案中,最后无论是找到了答案,或者找到了k个但是sum 不相同,这都需要return。循环遍历时刻,最外层的 for 用作遍历最前面字符串的每个字符,递归的是下一个数字对应的字符串,然后一层层的往下递归。首先是通过一个二维字符串进行映射,电话上的数字对应每个字符串的下标。

2024-02-04 22:38:07 314 1

原创 Day 21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

这里面其实有个注意的点,其实不设置left和right也能过,而且最好是整个中序遍历的额外函数,用一个void函数看的更好理解。236. 二叉树的最近公共祖先。501.二叉搜索树中的众数。

2024-02-02 17:50:15 154

原创 Day 20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

98.验证二叉搜索树。

2024-02-02 16:34:20 178

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

【代码】Day 23 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树。

2024-02-01 23:29:21 83 1

原创 Day 18 | 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

只考虑了层序遍历,简单粗暴,后面迭代啥的我再补。

2024-02-01 17:58:20 205 1

原创 Day 17 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

257. 二叉树的所有路径。

2024-01-28 22:47:04 188

原创 Day 16 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

111.二叉树的最小深度 (优先掌握递归)node看做是父节点去解释就比较好理解此递归过程。所以当父节点为NULL时候,则很自然就不存在深度,则就为0;之后就是分别计算左右子树最小的值,递归。假设计算完了,就得考虑所有的情况。若左右都为空,那只有父节点一个,那就返回1;若左有右没有,则不能直接返回最小的那个,假设直接返回最小的那个,右没有,则最小一定是1,但是这不合理,因为还存在左子树。所以最后得记录左子树的最小再加上父节点的1,后面跟前面一样进行,然后取最小。

2024-01-27 00:08:06 253

原创 Day 15 | 102.层寻遍历二叉树 226.翻转二叉树 101. 对称二叉树

写递归这种得先确定边界条件。我们要做的是判断节点的左右子树是否相等来判断是否是平衡二叉树。则会存在以下的一些情况:1、左右都为空,则true,2、左右至少一个是空,则false,或者我要判断的左右节点都有值,但是这里不能直接写 上面被注释掉的那个else,因为一旦写了,这个部分成立,最开始的俩个值就相等,那就直接return了,后面就不再做检查。

2024-01-25 17:02:11 395

原创 Day 14 | 递归遍历/迭代遍历

代码跟前序很像,前序遍历为: 中左右,栈是先进右后进左;若更改一下顺序即,栈先右后左,则会得到 中右左的顺序,然后对此顺序进行 reverse翻转一下,则 中左右就可以得到后序遍历的 右左中的顺序。第一个忘了pop导致错误,以及没有添加对root的判定,不然也会报错,会存在操作空指针这一情况。鉴于递归遍历二叉树没有可写的必要,主要就是记录迭代遍历以及我错误的地方。

2024-01-24 23:03:14 323

原创 Day 13 | 232.用栈实现队列 225. 用队列实现栈

以及我自己疑惑地点在这里解答,为什么有时候用 *it,有时候直接就 it->first,以上述代码举例,若我们想存放 It 所指代的pair对,放进优先队列,则我们需要对队列 迭代器进行解引用获得当前pair的引用,存放进优先队列里。而真正需要弹出的是当按照顺序,弹出最左侧的元素,而这个元素恰恰是最大的元素时候,不得不弹出。push:需要关注,当判断是否需要将数据推进队列,不是要跟对头比,而是跟队尾比,只有当比队尾大,才需要进行后续的操作,不然没必要进队浪费名额,反正他也不会是最大的。

2024-01-24 16:09:58 298

原创 Day 11 | 232.用栈实现队列 225. 用队列实现栈

为了迎合数据大小,改成 long long , 且需要将字符串转成 long long 形式,而且别弄错,num2 和 num1 ,到底谁÷ 谁,这个别弄反了。刚开始 用的是append函数,但是append不能直接对 char 进行操作,他只能对 string 进行操作且会修改被添加的字符串。swap只是单纯变换俩个变量的值,如果在这里面用的话,需要加一个循环。以及对字符串进行翻转用的是的 reverse 函数。1047. 删除字符串中的所有相邻重复项。150. 逆波兰表达式求值。

2024-01-21 18:03:20 398 1

原创 Day 10 | 232.用栈实现队列 225. 用队列实现栈

太简单粗暴了,就是俩个栈倒过来到过去的,没有代码随想录上精妙。当从1栈导入2栈时候,不用把2栈再弄回去,如果后面需要队列头部元素,直接从2栈上继续获取就行,只有当2栈为空时候,才需要将1栈再全部导入2栈中,再依次往复。模拟流程,熟悉具体API调用。

2024-01-20 18:53:10 394

原创 Day 9 | 数组/字符串/map/set 必备知识点

vector的底层实现是array当数组定义为空数组的时候,假设 vector nums 为空,如果你调用 nums.size()不会报错,但是nums.size()-2 就会报错,因为你在操作空指针进行运算,是非法操作。如果提前知道数组数量,提前开辟vector可以更提高效率。

2024-01-18 22:10:26 845 1

原创 Day 8 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串

问题出来了,如果将 if 语句放在下面,则在处理完最后一个单词的时候,还会执行一次空格添加,则此次空格添加就会导致 slow 大小出现问题,会多前进一步。思路就是一次走2k的距离,如果 I+k 还没到终点,就翻转 i+k 的字符,如果 i + k > 终点,则直接翻转 i 到终点的距离即可。resize 那里,弄错了需要扩充的大小,写成了 6 *,应该是 5 *,因为要包括数字原先占据的位置,所以得去掉一个。思路比较清晰,但是代码写的一般,尤其是自己定义的func,别忘了对指针进行范围缩减,老是忘。

2024-01-18 15:06:10 408 1

原创 Day 7 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

假设不双边收缩只收缩一边,那么根本不可能会形成 == 0 的情况,因为等于 0 所对应的值已经收进答案中,并且重复的已经去除掉了,所以要想找下一个答案,肯定是俩边双向收缩。对于这种问题,就是开辟一个数组空间,存放26个字母出现的次数,再用另外一个字符串里的字符去做对应的加加减减,而在此题中,如果信中的字符在杂志中没有或者用完了,那么对应的值肯定会小于0,通过这一点来判断是否有问题。排完序后,最外层 i 的循环,需要过滤掉与上一个 i-1 想同的值,因为 i-1 的答案一定是 i 所构成的答案的子集。

2024-01-17 19:04:01 657

原创 Day 6 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 142.环形链表II 1. 两数之和

其次需要理清楚 set 的原理,尤其是unordered_set,举个例子就是 [2,2,3,4,2],存进 set 里就是 [2,3,4] 不会有重复元素。根据快乐数的定义,题目明说了如果不是快乐数会导致数据循环,无尽循环,这样我只要通过设置一个 unordered_set 来确保每次保存计算的值,然后只要在某次计算中存在循环,那就可以直接说明不是快乐数。就直接用数组来存储字符串的值,再拿另外一个需要匹配的进行相减,如果相减之后数组内部存在不为 0 的项,说明俩个不相等。: 取商获得去除个位数后的值。

2024-01-15 22:49:32 345

原创 Day 4 | 24.两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07. 链表相交 142.环形链表II

之后就是对12进行变换,对12转换成21,我们得保留在转换中会丢失的节点信息,一个就是 1,一个就是3,因为按照顺序,我们会将 虚拟头结点指向2,则原本指向1的地址就没了,1就丢失了,那么我们就需要保存1的链表信息,代码中我定义为 tmp1,此外当我们完成了 虚拟头结点->2->1,之后 3本来是接在 2后面,但是 2后面按照顺序指向了1,所以 3的地址也就丢失了,那么我们就得额外给 3节点一个指针进行保存,代码中我定义为 tm3,当这些元素都保存好后,就可以按照正常的转换一步一步赋值进行下去了。

2024-01-13 23:29:35 438 1

原创 Day 3 | 203.移除链表元素 707.设计链表 206.反转链表

首先是创建ListNode时候,需要new一个。第二个,刚开始我弄混了 cur->next 和 tmp,我错以为是这俩个指针同时指向要被删除的值 val,但是细想一下,在最开始,我先用tmp指向了被删除的链表,接着用 cur->next 指向了下一个删除后的链表,所以 cur->next 已经跟要被删除的链表无关了,所以只有 tmp 指向要删除列表,则只需要 delete tmp 即可做到释放要被删除的链表元素。一个就是头指针,我们用虚拟头指针来代替,另一个就是链表长度。

2024-01-12 23:29:22 763

原创 Day 2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

错误源自于 resLen 变量刚开始我设置为 0,这样会导致在循环里 resLen > subLen 这里会出问题,因为如果为0,subLen刚开始计算肯定是 > 0 的,那永远也无法满足 resLen > subLen 这一条件,所以需要给resLen调控为 INT_MAX,这样保证在初次计算的时候,一定能更新 resLen的值。关于while(left <= right)这部分也思考了一会,只要拿俩个数进行一个示例运算就很明显能知道,必须要 <=。209.长度最小的子数组。977.有序数组的平方。

2024-01-11 22:16:33 333

原创 Day 1 | 704. 二分查找、27. 移除元素

其中 nums[j-1] = nums[j] ,最开始我给 j 赋值 i,然后 nums[j] = nums[j+1],这样会导致个问题,数组越界,当我遍历到最后一个数后,会去查看不合法的地址,导致内存溢出报错,这个点要牢记。1、左闭右开:说明右侧取到数组之外,是不在考虑范围内的数组下标,若当 middle > val 时候,说明我们需要变动右侧,则middle作为不被考虑的值,则右侧该赋值 right = middle。1、双指针法需要关注的是,什么时候需要去控制 low 指针往前走。

2024-01-10 22:12:39 610

空空如也

空空如也

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

TA关注的人

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