- 博客(40)
- 问答 (1)
- 收藏
- 关注
原创 代码随想录训练营day46|647. 回文子串,516.最长回文子序列
一开始我想的dp[i]表示到i为止有多少回文子串,但返现这样推到不出任何dp之间的关系。而如果把dp[i][j]定义为i到j之间是否是回文子串的话。则dp[i][j]和dp[i+1][j-1]是有关系的。注意到此时它依赖的是矩阵中左下角的dp所以遍历顺序是从左到右,从下至上。因为要保证j一定>=i,所以初始化时j=i。
2024-09-12 11:36:17
419
原创 代码随想录训练营day45|115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离
dp[i][j]表示的是在以是s[j]为结尾的字符串中最多可以找到几种组成以t[i]为结尾的字符串的方式。如果s[i]==t[j],1.利用第i个和第j个匹配,在j-1中寻找i-1.2.不适用这两个进行匹配,在j-1中寻找i如果s[i]!=t[j]则只能在j-1中寻找iint。
2024-09-11 20:54:33
519
原创 代码随想录训练营day44|1143.最长公共子序列,1035.不相交的线, 53. 最大子序和,392.判断子序列
这题并不要求连续子序列的要求是可以删除某些元素,但不能改变顺序。顺着上题的思路,这题也应该设立一个二维数组intdp[i][j]表示的是以text1[i]为结尾的字符串和以text2[j]为结尾的字符串的最长公共子序列。如果text1[i]和text2[j]相等的话,则dp[i][j]=dp[i-1][j-1]+1;(两个同时回退)如果不相等的话则应该考虑dp[i-1][j]和dp[i][j-1]中的最大值初始化的时候要注意,如果text1[i]==text2[0]
2024-09-11 18:25:40
308
原创 代码随想录训练营day43|300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
我一开始的想法是第i个数时,往找所有比他小的数的nums[j],用数组记录dp[j],排序后取末尾然后从这其中选择一个最大的加1。dp[i]的含义时以nums[i]为末尾结束的最长递增子序列。后来发现可以优化成不用数组。直接每次取dp[j]时比较。
2024-09-10 23:39:06
590
原创 代码随想录训练营day42|188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
变成了最多可以买卖k只股票int。
2024-09-10 19:57:23
351
原创 代码随想录训练营day41|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III
这题和贪心中的买股票很想,但这里不用考虑局部问题,因为只用买一张卖一张。我想可以用一个数组dp来记录买入价格和卖出价格。然后遍历数组草我感觉我写的想贪心。
2024-09-10 17:03:01
401
原创 代码随想录训练营day39|198.打家劫舍,213.打家劫舍II,337.打家劫舍 III
98.打家劫舍我是一个小偷,不能连着两家偷东西,问我能偷的最大价值?dp[i]的含义是到第i家时偷的最大金额注意dp[i-1]并不意味着一定偷i-1,只是在不偷i时,考虑前i-1个房间。太ez了哥们,
2024-09-10 14:42:47
445
原创 代码随想录训练营day38|322. 零钱兑换,279.完全平方数,139.单词拆分
dp[j]的含义是最少的零钱数。由于每个元素可以多次放入,不对,这是组合问题,不是排列问题,所以先遍历物品在遍历背包递推公式其实很简单:但难在如何初始化,使得dp[j]直接覆盖前者。我想到的一个办法是直接使得dp[j]=INT_MAX不过为了使得dp[j-coins[i]]+1不超过INT_MAX,应该加一个dp[j-coins[i]]!=INT_MAX的条件。
2024-09-09 19:19:04
698
原创 代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯
这是一个完全背包问题,就是每个物品可以无限放。在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。所以这里能多次放物体只需要把遍历顺序改改就好了。
2024-09-08 00:12:15
485
原创 代码随想录训练营day36|1049.最后一块石头的重量II,494.目标和,474.一和零
dp[i][j]要想装满只有两种方法,要么不装nums[i],这样它的方法数就等于dp[i-1][j]要么装上nums[i],这样就要把j-nums[i]的空间填满,所以。
2024-09-07 13:19:57
467
原创 代码随想录训练营day35|46. 携带研究材料,416. 分割等和子集
好吧,这里用的是一个二维数组dp[i][j],表示从[0,i]的物间任选武平,能用容量为j的背包装下的最大价值重量 价值物品0 1 15物品1 3 20物品2 4 30先考虑从[0,0]区间内的物品,容量为0时无法装,价值为0,物品0占用空间为1,所以1及以后价值为15再来看[0,1]区间内的物品。容量为1,2时价值为5,(此时不装物品1,延续dp[i-1][j]),容量为3时,价值为20(装了它背包剩余空间为j-3)剩余空间的最大价值是dp[i][j-weigh[j]],
2024-09-04 11:43:03
428
原创 代码随想录训练营day34|62.不同路径,63. 不同路径 II,343.整数拆分,96.不同的二叉搜索树
题目并不难想,每一个点只有两种走到的方法,要么从左侧来,要么从上侧来,所以 dp[i][j]=dp[i-1][j]+dp[i][j-1];int。
2024-09-01 20:17:20
713
原创 代码随想录训练营day32|509. 斐波那契数,70.爬楼梯,746. 使用最小花费爬楼梯
1.确定dp数组以及i的含义2.确定递推公式3.dp数组的初始化4.遍历顺序5.举例推导dp数组。
2024-08-28 14:18:48
379
原创 代码随想录训练营day31|56. 合并区间,738.单调递增的数字,968.监控二叉树
做了前面的题再做这个基本没太大问题就是一些细节上的问题第一次没处理到位,比如第一次写成了if(intervals[i][0]>intervals[i-1][1]),但要比较的是事实更新的temp或者要么在下面就直接更新intervals。
2024-08-27 19:58:27
617
原创 代码随想录训练营day30|452. 用最少数量的箭引爆气球,435. 无重叠区间,763.划分字母区间
牛逼,居然过了。但是[[9,12],[1,10],[4,11],[8,12],[3,9],[6,9],[6,7]]这个样例没通过。我想了一下应该是这边所有区间的开头都比10要小,但是想射[6,7]这个小区间导致后面开头>7的区间会射不到所以应该还想一个方法,如果当前区间被上一个区间整个包裹,那么以它作为新的比较标准。这样就通过了。
2024-08-27 13:56:19
346
原创 代码随想录训练营day29|134.加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队列
好吧第一遍写的时候读错题意了,以为是比较gas[i]与cost[i+1]的值,shit。但这样碰到大数据时会超时。如果从i开始到j处不满足,那从i+1处必然时不满足的,因为i处是在积累油量,这个想法就和之前求最大连续子数组和一样,直接果断舍弃,让i=j,然后下一次i++,就从下一处开始。
2024-08-26 22:59:06
567
原创 代码随想录训练营day28|122.买卖股票的最佳时机 II,55. 跳跃游戏,45.跳跃游戏 II,1005.K次取反后最大化的数组和
也可以直接写一个for循环,用max作为边界,然后动态的去更新max,这个思路很巧妙。把它分为n-1个相邻区间,每两天之间的利润是nums[i]-nums[i-1]如果利润为正的话就收集它。这个思路和那个求连续数组最大和就比较像了。如果还有奇数个剩余次数,对最小的正数进行操作。第一次贪心:优先取反负数。第二次贪心:取反最小的。
2024-08-23 17:07:25
453
原创 代码随想录训练营day27|455.分发饼干,376.摆动序列,53. 最大子序和
如果这样写,碰到[1,2,2,2,3]的数据时,摆动序列长度应该是2的,但是pre=1,cur=2时count++;所以应该考虑定义两个差值,一个记录前一个差值,一个记录当前的差值,如果这两个差值异号才能count++其实只用在一段数组它的sum<0时,果断把它甩走,然后从下一位开始重新计数就行,因为它对于之后的部分,不管怎样都是起到一个拖累的作用。最开始我想的是从两边找连续的最小数组和,然后用总和减去他们就是答案,但事实上这两个数组可能会有交叉的部分,1,-1,1;只用在坡度有变化时更新就行了。
2024-08-23 14:21:15
585
原创 代码随想录训练营day25|491.递增子序列,46.全排列,47.全排列 II
本题的难点在于细节上的处理:1.大于=2时才能加入2.不能排序,如何做到树层去重。
2024-08-22 23:00:00
494
原创 代码随想录训练营day24|93.复原IP地址,78.子集,90.子集II
我的思路是用vector来记录 path,当到终止条件时再设计一个string来接受。接下来还要写一个判断是否是符合条件的判断;和上面一样,注意排序后去重就行。
2024-08-21 16:03:27
165
原创 代码随想录训练营day23|39. 组合总和,40.组合总和II,131.分割回文串
要求:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的同一个数字可以无限制重复被选取。因为可以不停的用一个数字,所以在单层递归时不用传入i+1,继续传入i就好。
2024-08-15 21:10:16
644
原创 代码随想录训练营day22|77题. 组合,39. 组合总和,17.电话号码的字母组合
如果是求两两的组合。三个的组合可以再套一层for循环,但是面对求k个组合时,不停的写for循环就太麻烦了。考虑借用递归来解决for循环的嵌套,k个for循环就是递归k层,终止条件就是组合中有k个数。对于二叉树来说,横向只用取root->left和root->right,纵向用递归解决。而现在是一个n叉树,所以用for循环从左往右取,纵向仍然用递归解决.
2024-08-15 14:04:26
253
原创 代码随想录训练营day21|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
如果一个当前节点<low,那应该去查找它的右子树,并返回修建后的右子树;如果>high,那应该去看它的左子树怎么样,返回修建后的左子树。
2024-08-14 14:30:32
473
原创 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)
2024-08-14 13:59:31
418
原创 代码随想录day18|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先
和验证二叉搜索树的思路一样,用双指针。然后再设个int min=INT_MAX;当(root->val-pre->val)<min时更新min用中序遍历。
2024-08-14 00:05:24
550
原创 代码随想录训练营day17|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
其实这题和用中序+后序构建二叉树是一样的。找到最大值后将它的左右分为两个数组,然后分别放入root->left和root->right;
2024-08-13 14:32:47
325
原创 代码随想录day16|513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树
所以中间的节点就是后序的最后一位,因为没有重复的,所以可以根据postorder.back(),找到中序中对应值的下标,将前后分为两段中序,再根据其大小建立两段后序。需要记录用一个当前深度和最大深度,只有当深度>最大深度时更新result,这样同层不会处理第一个后面的数,任意遍历顺序都可,因为左都在右之前。注意这样传入root的引用,不用引用只是赋值拷贝,对传入的数据本身没有影响,root->left在函数外还是NULL;而当要记录所有路径和==目标值的路径时,用void即可。该问题是找到一条符合的路径。
2024-08-11 19:46:38
357
原创 代码随想录day15|222.完全二叉树的节点数,110.平衡二叉树,257. 二叉树的所有路径
直接用递归的方式求完全二叉树是可以的,但这样就等于把它当成了普通二叉树,没有利用到二叉树的特性,也就是只有最下面一层是不满的,而且从左到右连续。如果能确定左子树是否为满二叉树,则可以利用pow(2,depth)-1直接求出数量。可以利用一直向左遍历的深度和一直向右遍历的深度来判断是否是满二叉树,因为根据完全二叉树的性质,如果深度一样那中间必有节点。
2024-08-10 22:20:08
590
原创 代码训练营day14|226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度
对于根节点,只用将它的左右子节点翻转就行。其余节点也是,只要依次翻转每个节点的左右节点就行如果先处理根节点的左右节点,则是前序遍历。将swap放到最后,则是最后处理根节点,为后序遍历。但不能是中序遍历,不然处理会有重复。也可以用迭代来完成。
2024-08-08 16:42:38
265
原创 代码随想录训练营day13|二叉树理论基础,二叉树的递归,以及迭代
深度:层数满二叉树:全满,有2^(k-1)个节点。完全二叉树:只有最下面一层没填慢,而且那一层从左往右有节点的地方连续。二叉搜索树:左子树上节点均小于根节点,右子树均大于。平衡二叉搜索树:AVL,左右深度差小于等于1.
2024-08-07 20:31:52
600
原创 代码训练营第十一天|150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前K个高频元素
堆是完全二叉树(只有最后一行可以不被填满,不能没有左子树),每个父节点都不小于子节点(大顶堆)或都不大于子节点(小顶堆)。当i和j同在窗口中时,j大,如果j在i的右边,那有j出现时i一定不可能是最大值,所以i已经可以移除掉。取个极端情况,假如我只用1个,那么第一次弹出,那么我会弹出许多个k,这样还要把全部都排一遍才能确定。统计元素出现频率,可以用哈希表中的map,key是元素,value为频率。而当前面弹出的元素和j相同时,说明j已经不在窗口中,可以弹出。如果用大顶堆的话,那么每次弹出时将会把最大的弹出,
2024-08-06 18:32:45
293
原创 代码随想录训练营day10|栈和队列,232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
stack < 储存的类型 > 容器名在缺省时默认用deque实现栈,deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。其他实现方法还有vector(顺序栈)和list(链栈)规定链栈没有虚拟头节点,head直接指向栈顶,// 分配新的结点");// 将当前的栈顶元素赋值给新节点的直接后继top = p;// 将新的结点赋值给栈顶指针count++;return OK;
2024-07-30 16:13:56
641
原创 代码随想录训练营day9|151.翻转字符串里的单词,右旋字符串,28. 实现 strStr(),459.重复的子字符串
前缀aa 和后缀aa相同,则省去了模式串前缀he文本串b前面aa对比的必要,直接让模式串的j指向前缀的下一个字母b,跳过之前已经匹配过的地方。传统暴力算法遇到不满足的比如在ababad中查找abad,当遇到第四个字母与查找字母d不等时,再从第二个字母开始一一对照。而KMP算法分析前后缀,因为如果在查找模式串第n个字母时发现不对应,则至少前面都是一一对应的,如果有前缀和后缀相同。找到最长相等前后缀,如果一个字符串有子串,则它的最长相等前后缀不包含的地方则是最小子串。但这样比较麻烦,而且要申请新的空间。
2024-07-30 10:24:03
475
原创 代码随想录训练营day8|344.反转字符串,541. 反转字符串II,替换数字
用双指针,从后往前,遍历到数字时填充number。可以用两个指针,分别放在左右两边,移动交换。要求:将数组中所以数字字符换成number。另外一种就是直接用reverse函数。正着遍历也行,但需要创建一个新数组。翻转的时候是左闭右开的区间。1.指定字符及其个数初始化。
2024-07-29 00:52:45
367
原创 代码随想录训练营day7|454.四数相加II,15. 三数之和,18. 四数之和
将数组两两分组,把两组数组的元素相加有多少情况算出来,可以用map来记录,然后查找target-sum是否在map中出现过。思路:固定一个数,剩下两个数依次查找他们的和看与固定过的是否相加等于target。探索半天后只能在最前面判断nums.size()<4,小于的话直接return。和三数之和是一样的,只是再嵌套了一层循环。当我其他不改动,只是边界写成这样时,测试数组[0]会出现越界的问题,为了避免重复查找可以排序。然后在剩下两组计算时查找。
2024-07-28 22:59:00
277
原创 代码随想录训练营day6|哈希表:242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
将关键值key通过某种方式(哈希函数)映射为在哈希表上的位置。
2024-07-23 19:35:18
475
原创 代码随想录训练营第四天|24.两两交换链表中的节点,19.删除链表的倒数第N个节点,链表相交,142.环形链表2
用了一个一次移动两个位置的快指针和一个正常移动的慢指针来判断是否是环形,如果不是环形两者不可能相交。让相遇点index2和头结点处的index1同时出发,则在入口处相遇。如果m短n长,那只用比较n的后m位,所以要先用一个指针来移动,n>1时,则转了n-1圈再走z后会和index1处在入口相遇。和翻转链表的其实差不多,找到要交换的两个节点的前一位,然后。慢指针(x+y)*2=x+y+(z+y)*n,n必然>=1。链表相交也是同样的思路,先分别获得长度m与n,n=1时,说明x=z。
2024-07-23 11:17:54
276
原创 代码随想录训练营第三天|203.移除链表元素,707.设计链表,206.翻转链表
一次运行中初始化的时候没有给head赋值为NULL,导致其成为野指针报错;在里面定义临时指针temp,想着用完了及时处理掉,但忽略了temp。指向的内存也是cur指向的,所以会有指针悬空的报错。删除目标节点的方式一般为找到它的前一个节点,1.直接对头节点进行操作。
2024-07-20 23:13:05
365
原创 代码随想录训练营第一天|Leecode704.二分查找,(35,34扩展),Leecode27.移除元素
要删除3时,最后i=2时,会是2,2,3,(3);最后left与right相邻时,(1,2],middle会取到left,而left又等于middle,陷入了死循环。但取到的1并不是最右边的1,所以找右边界时,middle=target时,更新左边界=middle+1。因为有可能middle第一次就取到和目标值相等,eg{0,1,1,1,1,1,1,1,1,8};本来这不难的,但我在一个地方卡住了很久,就是while循环那里,当给的是3,2,2,3。l=middle+1,指向第一个比目标值大的元素的下标。
2024-07-17 15:22:09
685
空空如也
关于C++for循环的一些
2024-02-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人