自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营总结篇

为期两个月的算法训练营终于完结撒花了,回想这两个月一路走来,每天提醒自己的第一件事就是去做训练营的题目,然后看视频,写日志总结,最后打卡,都成了习惯了哈哈~ 这两个月以来,自己从一个看见算法题就发怵,到能够一刷就AC某些medium题目,虽然我知道离大厂笔试要求还有不小的距离,不过我会继续努力的,后面我肯定还会二刷三刷,说不定还要继续报名跟训练营呢~说起跟着卡哥训练营的节奏,真的很能督促自己不断的进步学习,其实在报名之前,我自己有过一段时间坚持刷力扣,每天就做三道题,按照不同数据结构的分类来做,

2024-03-17 10:32:35 449

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

和前面的题不同,求的两边第一个比当前遍历元素小(矮)的元素,因此单调栈是单调递减的,仔细体会和前面的不同,挺有意思的,单调栈的题目花样不多,但是很实用。

2024-03-15 21:11:49 170

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

这个题的关键是要弄明白,到底是纵向求和,还是横向求解,单调栈解法是横向求解,而暴力(双指针法)则是纵向求解。关键点在于对于循环数组,思路是两个同样数组头尾相连,遍历新数组过程中对下标I取模计算。

2024-03-15 18:39:37 175

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

求下一个更大元素,本题的技巧在于先建立nums1的元素值到下标的映射,方便nums2在遍历过程中寻找到index,注意stack.pop的作用域,无论nums2[stack[-1]]是否在map里,都是要pop掉的stack[-1]的。用单调栈确实很巧妙,因为是记录到更高温度的天数,因此相当于要求第一个大于当前数值的元素,从栈顶到栈底就是单调递增的。

2024-03-14 00:59:23 273

原创 代码随想录算法训练营day57| 647. 回文子串、516. 最长回文子序列

思路反而比上一题简单,递推公式分相等不相等情况,其中不相等时长度要进行比较取更大值,遍历顺序是i从下到上遍历,j从左到右遍历,确认初始化。本题回文子串是连续的,因此可比较i和j区间内的i+1~j-1区间,累加子串数目。

2024-03-10 13:29:31 72

原创 代码随想录算法训练营day55| 583. 两个字符串的删除操作、72. 编辑距离

编辑距离这道理难度确实大,一开始不太好想,但是只要认真分析了思路其实还是很清楚的。因为只有删除操作,因此只考虑删除word1或者删除word2的情况即可。

2024-03-09 17:02:38 152

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

dp数组定义为i-1结尾的s中包含的j-1结尾的t的个数,递推公式推导过程中,需要考虑s[i-2]和s[i-1]相等的情况,即可以使用s[i-1],也可以不使用s[i-1]的情况。本题实际上是最长公共子序列的变种,唯一不同点在于,判断s是否为t的子序列,s[i-1]和t[j-1]不相等时,只需要传递dp[i][j-1]的值即可。

2024-03-08 11:53:34 169

原创 代码随想录算法训练营day53| 1143. 最长公共子序列、1035. 不相交的线、53. 最大子序和

本题和最长重复子数组的区别在于,子序列可以不连续,因此对于不相同的字符,要判断和处理取值的情况,是取dp[i-1][j]和dp[i][j-1]的最大值。和上题一样,算是套了个壳子,只要能抽象出来题意是求最大公共子序列就没啥问题。相比于贪心解法,dp的解法更直观。

2024-03-07 11:28:25 127

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

此题的关键是dp数组的定义:即dp[i]是以nums[i]为结尾的最长递增子序列的长度,然后推导出递推公式dp[i] = max(dp[j]+1, dp[i]),遍历j的过程就是不断传递。涉及到两个数组的比较,需要两层遍历,定义二维数组,为了初始化时方便,定义dp[i][j]为以i-1结尾的元素nums1[i-1]和以j-1结尾的元素nums2[j-1]最长公共子数组长度。此题关键是连续,所以只需要比较dp[i] 和 dp[i-1]即可。

2024-03-06 14:11:16 224

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

本题主要是分清楚所有的状态,持有股票、卖出股票、冷冻期、冷冻期后保持不持有的状态,写起代码来就顺理成章了。本题和122相似,就多了一道减去手续费的操作。

2024-03-05 10:50:39 113

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

因为至多两次交易,所以每一天的交易状态有五种情况,dp数组初始化为二维数组,对不同状态的递推公式进行描述推导即可。此题是上一题的通用性解法,如果没有上一题的铺垫,想做出这道题还是很有难度的。

2024-03-04 15:32:02 143

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

因为本题只涉及一次买卖操作,因此考虑二维数组,对第i天的持有股票状态设为持有和不持有两种状态,由第i-1天的状态推导而来。相比于第一题还简单点,因为是多次买卖,根据第i天和第i-1天的价格关系推导出递推公式。

2024-03-02 12:24:11 110

原创 代码随想录算法训练营day47| 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

有点难度,关键是要想到使用后序遍历,把底层的节点状态一层层往上转移,和普通的动态规划给个数组的解法不同,要深刻理解递归和树的遍历。前题的变种,考虑到第一个和最后一个不能共存,可以划分为两种情况,取最大的。比较简单的动态规划问题。

2024-03-01 14:07:59 229

原创 代码随想录算法训练营day46| 139. 单词拆分、背包问题总结

01背包的二维dp数组实现先遍历物品或背包都行,第二层循环遍历是从小到大;而一维dp数组实现是先遍历物品,后遍历背包,且背包遍历是从大到小;本题状态转移方程需要遍历字符串,根据字符i和j之间的子字符串是否出现在字典中,来判断dp[j]的状态,感觉上确实不像是背包问题,没必要硬套。完全背包问题要根据题目判断是组合还是排列问题,求组合数是先物品后背包,求排列数是先背包后物品,两层循环遍历均是从小到大。

2024-02-29 21:59:03 280

原创 代码随想录算法训练营day45| 70. 爬楼梯、322. 零钱兑换、279. 完全平方数

本题求的是装满背包最少的物品,核心递推公式为dp[j]=min(dp[j], dp[j-coins[i]]+1),初始化dp[0]=0,注意排除组合不了的情况,返回-1。抽象成完全背包问题也很简单,其实m阶的楼梯都可以这样做。本题和上题差不多,难点就是初始化,dp[0]=0。

2024-02-29 16:08:29 171

原创 代码随想录算法训练营day44| 518. 零钱兑换II、377. 组合总和IV

本题是完全背包的求排列数,和上题不一样的是遍历顺序的选择,先遍历背包,再遍历物品,注意遍历背包的时候要从0开始。本题是完全背包求装满背包有多少种方法,求的是组合数,先遍历物品,再遍历背包。

2024-02-29 13:10:30 142

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

本题是求背包中装满物品总共有几种方法,是01背包的变种,递推公式dp[j] += dp[j-nums[i]]很重要。本题是01背包的又一变种,求的是给定背包容量,最多有多少个物品的问题,题目抽象出来的过程比较难以想到。01背包应用中比较好理解的一类,可抽象为背包中最多能装的最大价值的物品,接下来写代码就是水到渠成了。

2024-02-27 21:25:24 233

原创 代码随想录算法训练营day41| 416. 分割等和子集

学习了01背包问题的二维解法和一维解法,一维解法是对二维解法的状态压缩,本质上仍是二维,遍历顺序和二维也不太一样,物品是正序遍历,背包是逆序遍历,初始化决定了dp数组走向是否正确,本题的应用思路是把target看成是背包容积,nums数组里的元素看成是一个个物品。

2024-02-25 23:09:36 179

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

解放巧妙,对于一个固定的正整数n,所能构造的二叉搜索树数目依赖于根节点从1到n时构造二叉树的数目之和,再利用二叉搜索树的特性确定dp[j-1]*dp[i-j]为每一种根节点对应的二叉树数量,可得到递推公式。dp数组定义为正整数为i时最大拆分乘积为dp[i],因为可拆分为两个整数j 与 i-j,更多的可拆分i-j,因此可以推导出递推公式。

2024-02-25 02:18:03 324

原创 代码随想录算法训练营day39| 62. 不同路径、63. 不同路径II

【代码】代码随想录算法训练营day39| 62. 不同路径、63. 不同路径II。

2024-02-23 19:55:39 138

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

因为到达第0阶和第1阶上是不需要花费的,所以直接dp[i]定义为到达第i阶需要的花费,得到递推公式。斐波那契数列的变种,dp数组的初始化一定要契合dp数组的定义和含义。

2024-02-21 17:44:43 172

原创 代码随想录算法训练营day37| 738. 单调递增的数字、968. 监控二叉树、贪心算法总结

本题是贪心算法和二叉树的结合,需要约定好不同情形下左右子树传回的值,来确定当前节点的状态,从而判断监控的数量。选择从前往后遍历还是从后往前遍历是本题的关键,一旦确定了从后往前遍历,注意代码技巧就可以了。

2024-02-20 18:46:19 648

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

本题关键在于记录字母在串中出现的最远位置,可以利用字典的键唯一性,也可以使用数组来记录。本题的思路也是先排序,重叠区间是取相交,本题是取并集,因此是更新右边界为较大值。本题和452差不多一个思路,先用左边界排序和用右边界排序都可以。

2024-02-19 16:13:51 200

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

本题需要从两个维度考虑,先考虑身高维度,进行逆序排序,再考虑数量维度,对遍历的元素进行判断插入,妙处在于对身高进行逆序排序,这样后续操作时不会影响前面已操作元素。本题比较简单,因为需要把区间相邻的气球放在一起,所以要先进行排序,然后遍历过程中不断更新公共区间。本题是模拟类型题,需要找准局部最优策略即可解决。

2024-02-18 13:54:50 239

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

局部最优:若当前区间的累计和curSum小于0,则当前区间不存在满足题意的起点,更新start为i+1, curSum更新为0,重新开始寻找起点。局部最优:先对绝对值最大的负数操作,如果全部负数操作完后k还不为0,对绝对值最小的非负数进行剩余次数的操作。本题分两次比较,一次是从左向右遍历,一次是从右向左遍历,遇到后面比前面的评分高,则改糖果数。本题分两次局部最优,先操作负数,负数操作完还没结束,再操作绝对值最小的非负数,思路巧妙。

2024-02-16 17:00:18 205

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

不用纠结每次在哪里跳,跳几步,只需要求解最大覆盖范围,能覆盖到len(nums)-1的元素,即为True。和上题一样,关键是求最大覆盖范围,在每次更新覆盖范围时对step加一,最后即所需的最少步数。本题比较简单,只需要当天比前一天的价格高,即可计入利润,低于前一天就不计入。

2024-02-15 18:55:19 213

原创 代码随想录算法训练营day31| 455. 分发饼干、376. 摆动序列、53. 最大子数组和

此题贪心的关键在于子数组的连续和小于0时,需要抛弃当前,取下一个元素作为新的子数组起始,同时在遍历过程中不断更新记录的子数组最大和。(备注:是连续和小于0 ,不是当前元素小于0,因为即便当前元素小于0,只要连续和大于0,后续的元素仍有可能继续增大和的值)遍历数组过程中,对curdiff和prediff不断进行判断,几种情况的划分,尤其是存在平坡即相等数字情况下直接略过,不计入子序列长度。先排序,然后分别遍历两个数组,然后根据是否能满足对应孩子的胃口进行计数。

2024-02-14 18:11:06 195

原创 代码随想录算法训练营day30| 回溯算法总结

组合问题,切割问题,子集问题,排列问题,棋盘问题,每一种问题都是回溯的应用,回溯伴随着递归,同时也是深度优先搜索的应用,具体到每一道题目,涉及到如何剪枝,如何去重,如何设置终止条件,如何在for循环里面控制搜索范围等,都是需要关注的。解决N皇后问题,使用row控制递归深度,使用col控制for循环遍历集合的宽度,选取容器有技巧。和N皇后问题不一样的是,此题涉及到二维递归,因此实际上是三层for循环嵌套。332、重新安排行程。

2024-02-14 10:57:31 190

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

对于有重复元素的数组,去重就需要在树层上去重,用used数组控制,若当前元素和前一个元素值相同且used[i-1]为False的话,就是出现在树层,需要剪枝处理。递增子序列和子集问题的差别就是要保持递增的同时,还要进行去重,去重可以通过哈希或者数组的方式实现,使用数组在nums[i]范围有限的时候效率更高。排列问题不需要start_index控制和记录下一层递归时从哪里开始,统一从头开始遍历,只需要用used数组记录已使用的元素即可。

2024-02-08 17:48:14 132

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

子集和前面的组合问题,组合总和问题,切割问题的区别在于,每一层递归进去后,都要把结果存到最终结果集里,因此需要一进入递归函数就存结果(也可以在for循环里面存,放在path.append后面,初始化res的时候需要单独处理下空集)此题是在#78的基础上增加了去重的操作,即先给数组排序,然后添加树层去重逻辑。和切割回文子串差不多思路,关键在于终止条件的判断和单层逻辑里的剪枝。

2024-02-06 20:29:09 187

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

最关键的是对节点处理里面分割字串的区间判断,start_index是不变的,i是变动的,因此区间应该是[start:i]左闭合右闭。该题最关键的是去重,需要在单层逻辑里面剪枝去重,也就是所谓的树层去重,同时数组需要事先排好序,这是去重的前提。该题中元素可以使用多次,因此递归时start_index为i。

2024-02-06 15:34:21 210

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

电话号码的字母组合,该问题首先明确和前面组合问题的区别,组合问题是在同一个集合里面遍历,需要去重,而本题是在多个映射过去的集合里面组合,不需要去重,因此不需要start_index,只需要考虑往下递归时怎么找到下一个集合即可。基本上就是组合问题的变形, 思路和写法都一样。17、电话号码的字母组合。216、组合总和III。

2024-02-03 16:32:29 158

原创 代码随想录算法训练营day24| 回溯算法理论基础、77. 组合

回溯函数先写出终止条件,构造一个变量start_index来记录开始的索引,确保每一层递归的时候没有重复使用前值,self.path.pop()就是回溯操作,剪枝操作利用好可以优化代码执行效率。有递归必有回溯,回溯一般出现在递归之后,适用回溯算法的场景有:组合问题,切割问题,子集问题,排列问题,N皇后问题,解数独问题等。

2024-02-03 12:42:27 123

原创 代码随想录算法训练营day23| 669. 修剪二叉搜索树、108. 将有序数组转化为二叉搜索树、538. 将二叉搜索树转化为累加树

二叉树的内容比较多,但是核心还是掌握前中后序遍历的递归法和迭代法,还有广度优先的层序遍历,具体使用根据题目描述和树的特性来进行分析。关键是明确从右往左遍历,双指针记录当前节点和前一个节点的值。修建二叉搜索树,关键是做好区间的判断,递归思想很优美。538、将二叉搜索树转化为累加树。

2024-02-02 11:51:39 117

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

此题的关键在于厘清删除节点的情况,且删除节点操作是通过将函数返回值来传给上一层递归的左(右)子树完成的,方法巧妙。插入节点可以利用搜索树的特性,最后转化为插入叶子节点的操作,通过递归函数的返回值来进行赋值完成子树的连接。二叉搜索树查找公共祖先,可以利用搜索树的特性,自上而下快速查找,不像普通二叉树要从底层向上通过回溯查找。235.二叉搜索树的最近公共祖先。701、二叉搜索树中的插入操作。450、删除二叉搜索树中的节点。

2024-02-01 13:35:41 166 1

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

这道题首先要明确使用后序遍历,用前序遍历的话需要不断判断左右子树是否符合条件,非常麻烦且复杂用例会超时(别问我怎么知道的),而用后序遍历只需要把遇到的p或者q子树往上传即可,综合判断几种情况就可完成单层逻辑。用暴力法解决要构建哈希表记录节点值的出现频率,转化成根据频率排序的数组,比较麻烦,而通过定义max_count,在双指针移动过程中不断比较和更新count值,技巧性更强,只需要遍历一遍即可。501、二叉搜素树中的众数。用双指针法很方便解决。

2024-01-30 17:58:01 222 1

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

构造一个pre指针,指向当前节点的前一个节点,因为二叉搜素树的特性,后一个节点值总是大于前一个节点的值(中序遍历),因此不断更新指针可以进行判断。二叉搜索树的特性,左子树节点均小于根节点值,右子树节点均大于根节点值,所有节点均适用。此题是构建二叉树类的题目,用递归法,迭代法均可。此题比较简单,就是分类搞清楚就行。

2024-01-29 19:12:58 173

原创 代码随想录算法训练营day18| 513. 找树左下角的值、112. 路径总和、113. 路径总和ii、106. 从中序和后序数组构造二叉树、105、从前序和中序数组构造二叉树

112是判断是否存在符合条件的路径,因此递归函数需要有返回值传递给上一层,而113是找出所有符合条件的路径,因此不需要有返回值,直接往res里塞就完事儿了。只要掌握构造二叉树的思路,这两道题就不难,另外,需要注意切分数组的时候边界值很容易取错。106、从中序和后序遍历序列构造二叉树。105、从前序和中序遍历序列构造二叉树。此题层序遍历很简单,就不在此贴代码了。113、路径总和ii。

2024-01-28 13:23:51 116

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

这道题是前序遍历的方式,应为所有路径必然要从root开始向下遍历获得,值得注意的是在遍历左右子树时,需要回溯,回溯和递归是一起的,每一次递归都伴随着一次回溯。这道题的关键是左叶子的定义,要通过父节点来判断,左叶子必须是叶子节点。通过后序遍历来递归的判断是否为平衡二叉树。

2024-01-26 23:18:37 264 1

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

求最小深度时需要注意,当左节点为空或者右节点为空的情况,题目求的是根节点到叶子节点的距离,所以需要多写几条终止条件。如果要利用完全二叉树的特性做,需要加上递归终止条件:当左(右)子树为满二叉树时,返回子树的节点个数即2<<k-1。n叉树的本质其实二叉树差不多,无非是左右指针变成了children数组,通过对其递归,传递最大深度值。这里递归的本质是后序遍历,通过左节点和右节点不断的递归,往上传结果,最终返回最大深度。

2024-01-25 20:16:30 147

空空如也

空空如也

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

TA关注的人

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