自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第60天|● 84.柱状图中最大的矩形

和昨天的思路完全一样 单调栈直接解了 双指针法特别麻烦。

2024-06-04 18:04:16 298

原创 代码随想录算法训练营第59天|● 503.下一个更大元素II ● 42. 接雨水

单调栈是按行的思路 出现凹槽就记 算h*w的方块。每个柱子记下左边最大和右边最大 各管各的。我其实觉得双指针的思路很好。循环数组就是模拟的跑两遍。

2024-06-03 16:17:07 328

原创 代码随想录算法训练营第57天|● 739. 每日温度 ● 496.下一个更大元素 I

单调栈:维持一个单调的栈,用于解决离最近的比自己大or小的元素的距离。和之前那个top k 最小堆感觉思路是一样的。和上一题思路一样,实现上稍微绕了一下。

2024-06-02 18:48:07 359

原创 代码随想录算法训练营第56天|● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇

我觉得双指针更好理解,dp也是相同思路从左下到右上。双指针法,以每个为中心向两边extend。dp数组含义搞清楚就可以了!中心扩散版 dp从左下扩散到右上。

2024-05-31 15:57:50 348

原创 代码随想录算法训练营第55天|● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

增删替--增==对面删 删==删 替:+1。就是两个都要删除,取两个都删的最低操作。

2024-05-31 14:15:12 436

原创 代码随想录算法训练营第54天|● 392.判断子序列 ● 115.不同的子序列

s和t是不对称的 尾端相同的情况相当于加一波可能性 第一行和第一列也不对称。思路是一样的 相同字符+1 否则从前面顺下来。这个微软面试的时候考过 双指针就行。

2024-05-29 09:56:45 330

原创 代码随想录算法训练营第53天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

如果最后一样就加一,如果不一样,取两种子序列最大值,三个方向递推。其实就是最长公共子序列不能改顺序,注意分析题目套题库。用dp,基本上和贪心是一个思路 为负就从头开始。这个之前做过了,用的是贪心。

2024-05-28 10:22:17 339

原创 代码随想录算法训练营第52天|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

dp[i]:以i为结尾的最大递增序列长度 这样只用判断结尾的是否是递增的 否则从头开始。dp[i][j]看nums[i] nums[j]的公共序列。要把0-i中每个j都遍历一下和最后一个比较 找那个最大值。用res来记录历史上最大的。

2024-05-28 09:48:31 280

原创 代码随想录算法训练营第50天|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

冷冻期算单独一种情况:1.今天持有(已有or今天买)2.已经卖出3.今天卖出4.冷冻期。和之前的做法一样 只是减了个fee 这样要求maxdp[-1]感觉都是列个表格 每天的所有状态列出来 然后根据头一天去推算。基本掌握那个k次交易 和 冷冻期 就掌握特殊情况了。在最后一天的所有卖出状态中找最大值,包括冷冻期。

2024-05-26 20:10:21 323

原创 代码随想录算法训练营第49天|123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

和之前是一样的,就是变成了0次1次买不买2次买不买5种状态。因为都是和前一天比,还可以只用一行反复更新省空间。可以看到正反规律,推广到函数版本。

2024-05-24 18:49:12 312

原创 代码随想录算法训练营第48天|● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

因为只能买卖一次,开头一定是-price,结尾一定要卖出去。因为i只与i-1相关,还可以用滚动2维数组,用i%2来省空间。动归和上面思路一样,就是-price要加入前面的利润。贪心:左边取最小 右边取最大。之前用贪心做过,赚了就卖。

2024-05-23 17:44:31 311

原创 代码随想录算法训练营第47天|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

dp和nums等长就行 和上台阶差不多 取决于前面两个房子的价值。一个树形dp 每个节点的两个值分别的抢与不抢本节点 靠后序迭代。成环的话就是含头和含尾各做一遍。

2024-05-22 14:20:35 249

原创 代码随想录算法训练营第46天|● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

多重背包问题:把1s 改成 11 12 13 全展开变成01背包问题。排列问题先容量后物体 组合问题先物体后容量。用下标判断一下 和之前的组合方法差不多。01背包先物体后容量 从后往前。注意起始坐标和终止坐标。

2024-05-21 13:16:36 300

原创 代码随想录算法训练营第45天|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

组合问题先物品后容量 排列问题先容量后物品 这里取min,所以都初始化为float(‘inf’)只能爬1阶或2阶是简单的动规 爬1-m阶是完全背包。和上一题的套路完全一样。

2024-05-21 00:01:46 374

原创 代码随想录算法训练营第43天|● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

求完全背包的组合数 物品在外循环,容量在内循环 相当于物品排序不会重复。排列要先遍历物品后遍历背包 所以加一个下标的判断。完全背包每个物品有无限多个,遍历顺序从小到大。但从小到大排,本物品可以无限使用。此时遍历物品和遍历背包无所谓。

2024-05-19 15:51:18 243

原创 代码随想录算法训练营第42天|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

left=(target+sum)//2 所以只要能得到left 看dp[i]就是和为i的解法。dp[0]=1 没有也是1种 对每个num都该+dp[i-num]dp表示这个重量下能撞掉的最大重量。

2024-05-17 15:38:32 166

原创 代码随想录算法训练营第41天|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

滚动数组版:依次看什么时候放物品 注意从后往前 物品只有一个 从最宽敞的放 否则会放多次。看在maxsize的情况下放与不放物体的最大value。列为物品 行为maxsize。以sum的一半做01背包。

2024-05-16 23:02:19 196

原创 代码随想录算法训练营第40天|● 343. 整数拆分 ● 96.不同的二叉搜索树

究极拆分 左排列*右排列。公式:全拆3,剩1个4。

2024-05-15 20:14:31 357

原创 代码随想录算法训练营第39天|● 62.不同路径 ● 63. 不同路径 II

j从0开始 每个都要判断。

2024-05-14 16:18:16 291

原创 代码随想录算法训练营第38天|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

动归:有很多重叠子问题--状态能顺次推导,后一个动作受到前面动作的影响。DP的debug:推导DP数组--print出来看是否符合预期。(比如前一个动作占了背包的空间 后一个动作受剩下的空间的限制。只需要维护2个数 就一直往前移动 我感觉这个我写的很好看。不跳步版本:dp[n]=dp[n-1]+dp[n-2]贪心:每次都是取最小 不受挤压空间干扰)和上一题其实一样 但0也是一种走法。

2024-05-13 17:16:20 219

原创 代码随想录算法训练营第36天|● 738.单调递增的数字 ● 968.监控二叉树

发现第一位变小了其他的迅速变9。res是list才能传对象。

2024-05-11 14:25:06 405

原创 代码随想录算法训练营第35天|● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

先得到每个字母的最后出现位置 然后能划分就划分。和之前的是一样的,更新一个最短区间。搞一个list 更新尾巴。

2024-05-10 13:04:45 441

原创 代码随想录算法训练营第34天|● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

断档了就加一只箭 右边界按最左边的来算 因为箭一定在左边的右边界之前。思路就是先按照确定的身高排 确定一个信息再确定另一个信息。这里的lambda、list.insert都很好要学。正常模拟 有10返10。

2024-05-09 15:15:32 226

原创 代码随想录算法训练营第33天|1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

总和大的话 如果出现一个累计负值 说明到此都不行 需要后面的反补上。两边同时比不好比 左边一遍右边一遍。负的掰正,剩下的折腾绝对值最小的。

2024-05-08 22:14:55 347

原创 代码随想录算法训练营第32天|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

对在cover内的每格按照最远了跳。同时算当前的最远和下一步的最远。

2024-05-07 14:49:32 212

原创 代码随想录算法训练营第31天|● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

局部最优堆叠成全局最优--模拟一下 举不出反例就用贪心。也不用什么移除,数弯就行,没有就过。贪心的经典题 遇到负数重新算。属于是见过的套路题就记下来。

2024-05-06 14:31:05 269

原创 代码随想录算法训练营第30天|●332.重新安排行程 ● 51. N皇后 ● 37. 解数独

回溯是一棵树-for是横向遍历 递归是纵向遍历 唯一的变化是剪枝。深搜+回溯 好难 先按v排序 再递归。

2024-05-05 21:37:47 248

原创 代码随想录算法训练营第29天|* 491.递增子序列* 46.全排列* 47.全排列 II

同一层用过的不能再用--用一个set做剪枝判断重复。排列就不需要start 且需要一个used。和上题的思路基本完全一样 就是涉及去重问题。去重就一定要排序 用位次去重。

2024-05-04 15:06:05 244 1

原创 代码随想录算法训练营第28天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

属于切分问题 需要一个start。注意判断:起始≠0 数字范围。没有任何剪枝的纯递归回溯遍历。数字最多3位 提前剪枝。排序后 有连号的就跳过。

2024-04-30 16:16:22 171

原创 代码随想录算法训练营第27天|● 39. 组合总和● 40.组合总和II● 131.分割回文串

因为是可以重复的 每一层的元素都是自己到最后的所有元素 是包括自己的。和上一题的区别就是 一层会重复 选过的哪些重复元素剪枝掉。判断回文:python反向 正常:头尾双指针。start:一个集合的切分 需要start。处理自己 递归下层 弹出自己。加和如果已经大了就剪枝。

2024-04-29 18:27:51 102

原创 代码随想录算法训练营第25天|● 216.组合总和III● 17.电话号码的字母组合

这个题是两个集合的combine 和上一题其实差不多 需要一个全局的数字字母对应表。回溯就是【处理自己】- 【递归】-【弹出自己】这题可以剪枝很多:超了就剪枝;

2024-04-27 23:22:11 245 4

原创 代码随想录算法训练营第24天|回溯法介绍 77. 组合

i是那个最早的父亲节点(孩子是start==i+1) 如果i比较靠后,一直找到叶子结点这条path都无效。这个能取到 range左闭右开 所以到n - (k - path.size()) + 2为止。至晚要从该起始位置 : n - (k - path.size()) + 1,开始遍历。回溯 == 遍历+剪枝, 所有的回溯法都是树形结构。回溯可以剪枝,剪枝:起始范围。回溯:解决排列组合问题。

2024-04-26 16:17:58 276 1

原创 代码随想录算法训练营第23天|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

如果本节点小了,用右节点代替,因为左边都是小的 用右节点递归;某种程度上来说就是反复二分,mid是root,然后依次递归。不过需要一个全局变量记一下累加之后的值用于下次累加。其实就是安顺序排序 然后从后往前累加。所以就是反向的中序遍历就可以。如果本节点没问题,递归左右。看了半天主要是没看懂题目。

2024-04-25 16:57:28 149

原创 代码随想录算法训练营第22天|● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

这个和之前不一样的地方在于是二叉搜索树 二叉搜索树自带顺序 所以找到的第一个在pq之间的root就是最小的root。迭代版本 因为需要一个cur判断空,所以用一个parent指父亲防止走丢。左None右None 直接删;一个孩子为None 指向另一个孩子。左右子树都有:把左子树放到右子树的最左叶子结点下当左孩子。因为是二叉搜索树,只要在里面找到一个空节点能塞进去就行。比单纯的增加复杂了好多 要考虑所有情况。所以就是二叉搜索树按照数据范围的搜索。

2024-04-25 00:00:18 151

原创 代码随想录算法训练营第21天|● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

然后要注意一下返回值 找到的话返回root 否则返回有值的一波 有值说明找到了或者到头了。题解上的思路写的有点复杂 大概就是后续遍历天然可以判断是不是祖先。最简单的办法就是遍历一遍搞个frequency map。考虑一下本题的二叉树性质 中序遍历自带排序。中序遍历之后自然就是有序数组。

2024-04-23 20:46:40 188

原创 代码随想录算法训练营第20天|● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

取一个值为最左边的最小值,这个如果没什么问题,就把值更新为root 也就是list[:root]的最大值。此时再去和root.right比较 此时root.right的所有节点都要>root 成立则继续朝右走。层序的时候要传入两个树的信息,都有孩子的时候传入queue,没有孩子的时候直接给孩子。左边都<root没问题 重点是右边的左节点不能小于root。二叉搜索树是有序的 直接搜就行 利用有序很简单。其实最简单的方法是中序遍历之后看排序是否递增。注意树里也不能有相同元素。

2024-04-22 19:40:52 221

原创 代码随想录算法训练营第18天|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

前序确定root 中序拆分左右 用左右的长度在前序继续拆分。学一下什么时候递归需要返回值 但我感觉思路不需要这么复杂。然后前左前右和中左中右都有了 分别对左右子树递归。以最左为优先 最大深度为答案。层序很简单的 注意缩进。

2024-04-21 00:01:09 169

原创 代码随想录算法训练营第17天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

回溯的话 就是当前处理完成 把自己弹出 回归到上一节点。不平衡可以提前截止回传的 平衡的话还是要明确回传深度。cur是当前处理的节点(逐层向下)有子节点就往后添加。如果当前是叶子结点了,则对应的path也就完成了。迭代法:只有有左叶子的时候才有值 其他时候都是0。否则就更新对应的path 往后续左右孩子版本。顺着下去找左子树的左叶子和右子树的左叶子。左叶子节点要从他的父节点就开始判断。从父节点到子节点 所以是前序遍历。迭代法(感觉迭代法更好理解一点)从这里开始引入回溯的概念。

2024-04-19 23:18:25 236

原创 代码随想录算法训练营第16天|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

递归法:取左右孩子的最大值加一就是根节点的深度也就是整棵树的高度。所以不能直接取min:有一个孩子就不是叶子结点不能结束。层级遍历同理,注意遇到叶子结点就可以回了。所以把有一个孩子的情况列出来防止结束。坑在终止条件:要找一个叶子结点结束。和上一题思路是一样的。

2024-04-18 20:20:45 185

原创 代码随想录算法训练营第15天|● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

我是觉得层序遍历就可以 不过注意None的话孩子也得是None 不然会有空子。一层攒齐了合到level再合到res。bfs的精髓就是搞个queue。bfs通用模板可以打包刷很多题。一颗比中左右 一颗比中右左。

2024-04-17 15:52:38 226

空空如也

空空如也

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

TA关注的人

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