- 博客(41)
- 收藏
- 关注
原创 代码随想录Day48 | 739.每日温度,496.下一个更大元素I,503.下一个更大元素II
与上一题类似,利用栈求出nums2中每个元素的下一个更大元素,存储到map中:元素值->下一个更大元素值。相对容易想到,维护一个栈,栈中存储尚未找到更高温度的天数下标。比上一题增加了循环数组的条件,多遍历一遍数组即可。注意下标要对数组长度取余。然后从map中读取值。
2025-02-25 23:05:21
533
原创 代码随想录Day45 | 115.不同的子序列,583.两个字符串的删除操作,72.编辑距离
当前字符匹配上时,如s = “babgbag”, t = “bag”,此时有两种情况。t的 0 - j-1 部分 在 s的 0 - i-1 部分中出现的次数。word1前i个字符 与 word2前j个字符 删除后相同的最小步数。将word1前i个字符转换为word2前j个字符所使用的最少操作数。当前字符没有匹配上时,只能到 babgba 中 寻找 bag。一个为空时,需要删除的步数即为另一个字符串的长度。
2025-02-17 16:37:06
516
原创 代码随想录Day44 | 1143.最长公共子序列,1035.不相交的线,53.最大子序和,392.判断子序列
text1的 0 - i-1部分与text2的 0 - j-1部分的lcs长度。nums[i]加入当前连续子序列和 或 重新计数 取最大值。以nums[i]结尾的数组的 最大子数组和。与上题最长公共子序列问题一模一样。
2025-02-15 22:25:52
423
原创 代码随想录Day43 | 300.最长递增子序列,674.最长连续递增序列,718.最长重复子数组
以 nums1[i-1] 和 nums2[j-1] 结尾的最长公共子数组长度。为结尾的最长严格递增子序列的长度。定义:从 0-i 范围内计算,以。
2025-02-11 11:53:03
292
原创 代码随想录Day42 | 188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费
因为有一天冷冻期,所以第 i 天买入的话,第 i-1 天不能卖出。状态转移加上手续费即可。股票买卖通用代码模板。
2025-01-23 11:58:23
470
原创 代码随想录Day41 | 121.买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III
与题1的区别:题1只能买卖一次,所以如果买入,持有利润只能是-prices[i]题2可以买卖多次,可以在前一天dp1基础上买入。
2025-01-20 15:48:49
670
原创 代码随想录Day39 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III
在dfs的后序遍历位置进行判断,每个节点根据子节点能够盗取的最高金额进行判断。打家劫舍2,房屋成环,求两次打家劫舍1即可。一次不包括最后一个房屋,一次不包括第一个房屋。
2025-01-19 18:15:29
716
原创 代码随想录Day38 | 322.零钱兑换,279.完全平方数,139.单词拆分,多重背包
可以将同一种物品的多个物品,均视为不同种,重量和价值相等的物品,也就是。,需要注意的是:因为题目中要求最小值,代码中会用到min函数,所以。,但是此题是在拼接字符串,所以涉及到不同排列的问题,所以要。,状态转移方程也要注意一下,详见注释。问题,其实就是01背包中的每个。,这样就还是01背包问题。循环中要判断值是否合法。
2025-01-17 18:02:43
664
原创 代码随想录Day37 | 完全背包,518.零钱兑换II,377.组合总和Ⅳ,70.爬楼梯
所以在状态转移方程中,取物品 i 的情况是从第 i 行计算而来,而不是第 i-1 行。用每次可以爬的楼梯步数,装满容量为总楼梯数的背包,的排列数。与01背包的不同在于,
2025-01-16 16:15:24
568
原创 代码随想录Day36 | 1049.最后一块石头的重量 II,494.目标和,474.一和零
视为背包问题,求解 sum / 2 容量背包能装下的最大重量返回的是 这一部分石头 与 另一部分 的差值的绝对值代码即为经典的01背包问题// 视为背包问题,求解 sum / 2 容量背包能装下的最大重量// 返回的是 这一部分石头 与 另一部分 的差值的绝对值// dp[i][j]的定义为:// 从 0-i 取石头,装进容量为 j 的背包可获得的最大重量i++) {j--) {// 状态转移:取石头 与 不取石头 的最大值。
2025-01-15 16:22:20
345
原创 代码随想录Day35 | 01背包问题 二维,01背包问题 一维,416.分割等和子集
动态规划经典问题dp定义:表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少状态转移方程:初始化:遍历:先遍历行,也就是先遍历物品,再遍历背包容量01背包问题 一维因为在二维里,的值只与左上角(上一行且左边)的值有关,所以只保存一行的值即可。状态转移方程:遍历顺序:因为要用到左上角的值,在一维里就是左边的值,所以要从后往前遍历,不然会影响到左边的值416.分割等和子集难点在于将问题转换为动态规划问题:然后就是背包问题的代码形式[j]:
2025-01-14 11:57:04
387
原创 代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树
要注意到,二叉树种类数目 = 左子树种类数目 * 右子树种类数目。动态规划问题,相对简单,想清楚状态转移方程就好,详见代码注释。比较标准简单的一道动态规划,状态转移方程容易想到。相比上题只多了一个障碍的判断。
2025-01-13 11:41:29
571
原创 代码随想录Day32 | 509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯
难点在于看出来状态转移方程:爬到n层的方法数目,是爬到 n-1 , n-2层的数目和。dp[i]表示从 i 出发之前的最小花费,cost[i]表示从 i 出发所需的花费。动态规划:其实是还是斐波那契数列问题,唯一区别是初值不同。当前状态只与前两个状态有关,所以只记录前两个状态即可。发现动态规划的难点在于想明白。
2025-01-11 13:09:54
385
原创 代码随想录Day31 | 56.合并区间,738.单调递增的数字,968.监控二叉树
本题的难点在于想清楚节点的四种状态,并在后序遍历位置根据状态进行对应的操作,详见注释。贪心:找到第一个递减的位置。把第一个数字-1,后面的数字全部设为9。排序 + 贪心:合并区间问题。需要注意重复数字的情况。
2025-01-10 17:02:01
428
原创 代码随想录Day30 | 452.用最少数量的箭引爆气球,435.无重叠区间,763.划分字母区间
在当前**最早结束的区间end处(x_end)**射出一支弓箭,尽可能多的引爆气球。这道题的难点在于,把划分问题转换为区间问题。如果发现不能引爆了,则将其作为。排序 + 贪心:实际上是一个。
2025-01-09 17:22:07
377
原创 代码随想录Day29 | 134.加油站,135.分发糖果,860.柠檬水找零,406.根据身高重建队列
这道题比较简单,贪心思想就是收20块的时候,优先找零十块钱,其次才是5块钱。遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。作为起点「恰好」无法走到站点。
2025-01-08 23:08:48
451
原创 代码随想录Day28 | 122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II,1005.K次取反后最大化的数组和
每一步的跳跃过程中,记录下一步可以到达的最远距离,选择最远的跳点(以达到跳跃次数最少的目的)贪心思想:每走一步将 remain 更新为可用的最大步数。但是不会记录从哪里起跳,只记录下一步可以到达的最远距离。与上一题不同,记录跳跃次数。
2025-01-07 18:59:54
245
原创 代码随想录Day27 | 455.分发饼干,376.摆动序列,53.最大子序和
题中条件:子序列 可以通过从原始序列中删除一些,所以求的是整个数组中。只有在 正负 发生变化的时候,才 记录并更新。这样只需要遍历数组,比较前一次的差值。时不进行操作,以跳过元素相等的情况。是否异号,记录正负变化次数即可。贪心算法的第一道简单题。遍历时记录一个区间和。
2025-01-06 17:31:57
299
原创 代码随想录Day25 | 491.递增子序列,46.全排列,47.全排列II,332.重新安排行程,51.N皇后,37.解数独
与上一题的剪枝思路一致,保证相同元素的相对顺序始终相同,来避免重复操作,否则会超时。记录同层回溯树中用过的节点,用于在同一层中避免重复,因为本题的数组是无序的。是用来在回溯树的一条选择路径上避免重复的,与上题要注意区分。used维护每一个下标的元素是否使用过。比如说重复数字 2, 2’, 2’',这个地方是较难理解的,需要注意!这道题的难点在于重复元素的剪枝。,这样才可以避免重复,
2025-01-05 14:44:05
335
原创 代码随想录Day24 | 93.复原IP地址,78.子集,90.子集II
子集问题,递归时携带参数start,标识从数组的start下标开始,避免重复。难点在于判断条件以及边界的把控,还有剪枝的条件,详见代码。对数组排序,再跳过相邻的相等元素即可。
2025-01-03 11:20:25
131
原创 代码随想录Day23 | 39.组合总和,40.组合总和II,131.分割回文串
因为数字是可以重复选取的,所以i时可以重复选取i,但到了i+1时则不可以了,以此方式来。对数组排序,在for中做选择时,跳过重复值,以避免进入相同值的树枝。超过目标和,剪枝,提升效率。与上一题类似,需要注意的是。,这里需要注意的是,
2025-01-02 10:53:35
365
原创 代码随想录Day22 | 77.组合,216.组合总和III,17.电话号码的字母组合
然后按照charLists里的顺序按深度进行拼接,返回。先将需要组合的字母列表都加入到charLists记录。若剩下的选择不够满足k个数的组合,则不需要再做选择。与上一题类似,多维护一个路径和,并加以判断。,以排除左边已做过的选择。辅助函数进行选择尤为重要。回溯算法分为两部分,
2025-01-01 16:26:37
244
原创 代码随想录Day21 | 669.修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
递归对数组下标范围的元素建树,中间节点做树根,递归建立左右子树。BST中序遍历时,左中右升序,右中左就是降序。中序遍历位置记录累加和并修改节点值。维护一个preSum记录累加和。
2024-12-31 10:01:55
231
原创 代码随想录Day20 | 235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
节点值左小右大,通过节点值判断在哪边找或返回root。
2024-12-30 10:17:15
172
原创 代码随想录Day18 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先
中序遍历的序列是有序序列,很关键!一定要记得用这个性质!:中序遍历的序列是有序序列。
2024-12-29 10:54:58
230
原创 代码随想录Day17 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
找到最大值和对应索引,递归建树。二叉搜索树性质的简单使用。
2024-12-28 11:09:28
206
原创 代码随想录Day16 | 513.找树左下角的值,112.路径总和径,113.路径总和II,106.从中序与后序遍历序列构造二叉树
这个题和105.从前序与中序遍历序列构造二叉树是一样的思路。维护当前路径与路径和,每次遍历时比较,总体思路同上。记录当前路径总和,每次与target比较即可。层序遍历,每次记录每层最左边的节点值。
2024-12-26 23:03:27
199
原创 代码随想录Day15 | 110.平衡二叉树,257.二叉树的所有路径,404.左叶子之和,222.完全二叉树的节点个数
完全二叉树分为两种情况:满二叉树 和 普通完全二叉树。dfs,path保存当前遍历的路径。dfs增加对左叶子节点的判断。
2024-12-26 19:13:24
416
原创 代码随想录Day14 | 226.翻转二叉树,101.对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度
二叉树的递归遍历,即 dfs,常用的写法是维护一个用到的参数和结果res。在递归过程中更新这两个参数。
2024-12-24 15:01:21
223
原创 代码随想录Day13 | 递归遍历,迭代遍历,统一迭代,层序遍历
要处理的节点放入栈之后,紧接着放入一个空指针作为标记,遇到null标记时才将栈中的下一个元素加入res。前序:中左右,入栈顺序为右左中,中节点访问过,但是还没有处理,加入空节点做为标记。中序:左中右,入栈顺序为右中左,中节点访问过,但是还没有处理,加入空节点做为标记。后序:左右中,入栈顺序为中右左,中节点访问过,但是还没有处理,加入空节点做为标记。:后序在前序的基础上修改为 中右左,然后反转为左右中即可。:维护一个指针加栈,cur指针指示的是当前遍历的节点。迭代方式的遍历之前没有写过,学到了。
2024-12-23 09:43:04
379
原创 代码随想录Day11 | 150.逆波兰表达式求值,239.滑动窗口最大值,347.前 K 个高频元素
注意 java Collection 的使用,以及 Stream 的使用,本身逻辑不难。用双端队列维护一个单调降序的队列,最大值即为队头元素。后缀表达式求值,用栈即可。
2024-12-21 20:06:29
183
原创 代码随想录Day10 | 232.用栈实现队列,225.用队列实现栈,20.有效的括号,1047.删除字符串中的所有相邻重复项
【代码】代码随想录Day10 | 232.用栈实现队列,225.用队列实现栈,20.有效的括号,1047.删除字符串中的所有相邻重复项。
2024-12-20 17:37:51
356
原创 代码随想录Day09 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28.找出字符串中第一个匹配项的下标,459.重复的子字符串
先写一个高赞题解的代码,下次再慢慢琢磨,KMP上耗费了很多时间。普通循环做法,对于每个起始点,遍历确认是否匹配。先反转整个字符串,再反转左右两部分字符串。
2024-12-19 16:43:59
347
原创 代码随想录Day08 | 344.反转字符串,541.反转字符串II,卡码网:54.替换数字
每隔一段距离反转一小段字符串,原理同上。StringBuilder做法,较简单。
2024-12-18 15:02:52
284
原创 代码随想录Day07 | 454.四数相加II,383.赎金信,15.三数之和,18.四数之和
将 1,2 和 3,4数组分别求和,视为两数之和。和day06的242.有效的字母异位词差不多。在三数之和基础上再加一个指针。记录字母出现次数即可。
2024-12-17 11:39:08
183
原创 代码随想录Day06 | 242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和
关键是要知道快乐数的性质:要么各位平方和会到1,要么会无限循环,那么怎么检测循环呢。要想到用一个哈希表存 值 到 索引 的映射。Set 集合保存出现过的数字并去重。直接用数组记录字母出现次数的差值。注意记住 集合转普通数组的方式。
2024-12-16 10:17:30
162
原创 代码随想录Day04 | 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题02.07.链表相交,142.环形链表II
两链表相交问题:双指针遍历两个链表,遍历完每个链表时,指针移到另一个链表头上。相当于将两个链表连接起来,两个指针相等时,即为交点。慢的比快的慢走n步,以此来找到要删除的节点。
2024-12-15 15:54:05
181
原创 代码随想录Day03 | 203.移除链表元素,707.设计链表,206.反转链表
分为递归和遍历做法,两种做法都有一些细节要注意。单链表基础的删除元素题目。简易实现单链表和双链表。
2024-12-13 17:28:04
245
原创 代码随想录Day02 | 209.长度最小的子数组,59.螺旋矩阵II,区间和,开发商购买土地
维护横向和纵向的前缀和数组,分别统计,计算两个区间的差的最小值。循环向边界上的四条边添加数字,同时更新边界值。维护前缀和数组,索引0处设置为0,方便计算。原理很简单,写起来又很繁琐,令人难崩的题。最典型的滑动窗口代码。区间和即为前缀和的差。
2024-12-12 11:34:25
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅