自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录训练营第18期刷题总结

在过去两个月跟随卡哥从数组、链表、哈系表、字符串、栈与队列、二叉树、回溯算法、贪心算法、动态规划、单调栈这十个部分刷题,我很庆幸,我没有放弃,我把所有的题目都写了一遍,并没有很开心,因为我知道自己还有一些题目是没有完全弄懂的,尤其是动态规划的子序列那片题目,但是我应该感到开心并且也要有成就感,除了动态规划的后半段,前面的题目我都是尽量在弄懂。

2023-09-10 11:27:29 420

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

本题要计算是的是柱状图中的最大矩形,最容易理解的就是在下标i处,找到左右比它小的第一个元素的位置,计算这两个元素的位置之差减一为宽,heights[i]为高,则把当前的元素为高度基准的矩阵算出来了。在单调栈中,储存时分为三种情况,此时单调栈从头到尾按照递减的方式的储存,当height[i]>height[st.top()]时,push i,等于时,先pop,再push,小于时,此时st.top()对应的height左(top下一个元素)右(i)两边都比它小,则开始计算面积,最后取最大的面积。

2023-09-09 19:01:38 256

原创 代码随想录训练营第五十九天|503.下一个更大元素II、42. 接雨水

思考:本题将双指针法和单调栈法都做了一遍,双指针法的主要思路是按列进行计算,提前将每个元素左右两边的最大元素确定下来,再计算,本题重点要讲的是单调栈思路。单调栈中,从栈头到栈尾按照从小到大的元素来排列,因此分为三种情况,当height[i] < height[st.top()]时,将i放入栈中,等于时,先pop,再push i,大于时,此时开始计算雨水的面积,每次是按照行来进行计算的,知道height[i] < height[st.top()]时,再push i,这个过程中将雨水面积累加起来即可。

2023-09-09 18:51:28 244

原创 代码随想录训练营第五十八天|739. 每日温度、496.下一个更大元素 I

大于的话,则将栈顶对应下标位置与当前下标位置求差,计算的结果保存,这里主要要一直判断是否大于,因为当前元素不止比栈顶的大,计,注意把计算后的下标从栈内pop处,等到所有计算完毕后,将当前下标push到栈中。思考:本题与上一题类似,与上一题不同的是,本题相当于求解的是在nums2出现的比nums1元素大的第一个右边的元素,因此在遍历nums2时出现了比栈顶大的元素时,判断栈顶的元素是否出现在nums1中,如果出现在,则填充当前下标对应的元素到栈顶元素对应下标的结果中。496.下一个更大元素 I。

2023-09-08 20:19:11 224

原创 代码随想录训练营第五十七天|647. 回文子串、516.最长回文子序列

状态转移方程,当s[i] == s[j],dp[i][j] = dp[i + 1][j - 1] + 2,不等时,有两种情况,说明同时加入s[i],s[j]不能满足情况,分别加入s[i]和s[j]试试,则dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]),初始化时对角线都为1,根据dp数组可以得。思考:本题的重点在于对于dp[i][j]的理解,dp[i][j]的含义是在下标为i和j区间内的字串是否为回文串。基本思路:注意理解dp[i][j]的含义,按照代码的思路来即可。

2023-09-07 18:22:22 106

原创 代码随想录训练营第五十六天| 583. 两个字符串的删除操作 、72. 编辑距离

当word1[i - 1] == word2[j - 1]时,此时不需要删除元素,因此dp[i][j] = dp[i - 1][j - 1];当不相等时,可以通过删除(删除word1[i - 1])、增加(删除word2[j - 1])、和替换(word1[i - 1]替换为word[j - 1])来操作,分别对应的时dp[i - 1][j] + 1、dp[i][j - 1] + 1、dp[i - 1][j - 1] + 1,选择最小情况,初始化和上题一样。步骤:注意思考的内容,按照步骤来即可。

2023-09-06 21:21:04 933

原创 代码随想录训练营第五十五天| 392.判断子序列、115.不同的子序列

思考:dp[i][j]的含义是以下标i - 1为结尾的字符串s和以下标为j - 1为结尾的字符串t的相同子序列的长度为,本题的重点在于对状态转移方程的理解,一共有两种情况,当s[i - 1] == t[j - 1]时,则,dp[i][j]由dp[i - 1][j - 1]推出来,如果不相等,则相当于把t中的t[i - 1]删掉,再寻找,即dp[i][j] = dp[i][j - 1](以i - 1结尾的s 和 以 j - 2结尾的t),最后结果返回dp右下角即可。115.不同的子序列。

2023-09-05 18:25:27 37

原创 代码随想录训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

text2[i - 1]的情况,上一题不需要考虑是因为不相等的话dp[i][j]直接就等于0了,又因为初始化时都为0,所以不需要处理,而本题根据实际情况需要考虑,有两种情况,取最大值即可,其他的思路和上一题一样。下面是动态规划的思路,dp[i]的含义是以nums[i]为结尾的最大子序和,初始化之前要明确的是结果中至少要有一个元素,因此dp[0] = nums[0],才能进行下面的比较,每次算出dp[i]之后更新result,取最大值,遍历完毕后返回result即可。1143.最长公共子序列。

2023-09-04 17:38:30 52

原创 代码随想录训练营第五十二天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

构建dp数组,dp[i][j]含义是以下标为 i - 1 和 j - 1 为结尾的数组A和B的最长重复子序列,初始化时数组全部初始化为0,这里dp[i][j]的含义就体现了出来,不需要对dp[0][j]和dp[i][0]一个一个初始化。思考:明确本题dp数组含义,dp[i]指的是到下标为i的数组中最长递增子序列个数;因此dp[i]只与dp[i - 1]有关,如果nums[i] > nums[i - 1],那么dp[i] = dp[i - 1] + 1,并更新result,获得最大的dp[i];

2023-09-03 17:28:59 236

原创 代码随想录训练营第五十一天| 309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

情况一,持有的情况,持有可能有三种情况,第一种是前一天就持有,第二种是前一天未持有(非冰冻期和当天卖出的情况),第三种是前一天是冰冻期的情况,三种情况选一个max;情况二,不持有的情况(不包含卖出当天和冰冻期),不持有可能有两种情况,前一天不持有,前一天是冰冻期;基本思路:明确为什么会被分为以上四种情况,持有没有分,因为卖完后有冷冻期,持有从一种情况被分为了三种情况,因为卖出要有一种情况,作为冰冻期的参考,那么冰冻期也要有一种情况,剩余的未持有的非冰冻期和非卖出作为了一种情况。

2023-09-01 17:35:30 101

原创 代码随想录第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

思考:本题是可以买卖k次,通过上一题可以找到规律,主要是明确状态转移公式,要对1-k次依次创建状态转移公式,每天k次的状态都是持有和不持有两种,因此状态转移方程共有2k个,但是每次的的两种情况规律是一样的,每次持有的状态是两种情况,前一天的持有状态,或者是前一天未持有的状态减去prices[i];思考:本题与昨天的题目不同点在于可以购买两次,因此第i天一共有四种状态,第一次持有,第一次未持有,第二次持有,第二次未持有,每次都有对应的状态转移公式,第一次持有的话,两种情况,前一天的,或者是当天买的;

2023-08-31 19:33:53 285

原创 代码随想录第四十九天|121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II

思考:本题的需要明确的是状态转移方程的由来,每一天需要统计是否持有股票时的金额,因此每一天是有两个状态的,持有和不持有,dp[i][0]的含义是第i+1天没有持有股票时的金额,dp[i][1]的含义是第i+1天持有股票时的金额,通过分析可以知道,dp[i][0]由两种情况,一种是前一天就没有持有股票,另外一种情况是今天卖掉股票,因此对这两种情况取最大值,因此第i+1状态转移公式如代码中所示;最后返回未持股票的最后一位为答案。基本思路:补充一下,注意初始化。122.买卖股票的最佳时机II。

2023-08-30 20:19:10 180

原创 代码随想录训练营第四十八天|198.打家劫舍 、 213.打家劫舍II 、 337.打家劫舍III

思考:首先要明确本题dp[i]的含义,指的是偷到i + 1家的最多金币数,根据题目的定义,如果选择偷第i + 1家,那么dp[i] = dp[i - 2] + nums[i],如果不偷第i + 1家,那么dp[i] = dp[i - 1],因此,是否偷第i + 1家取决于这两种情况哪一种更大,则状态转移公式为dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]),根据状态转移公式给dp[0],dp[1]赋初值,并对nums进行遍历,最后返会dp数组的最后一个结果即可。

2023-08-29 21:42:59 159

原创 代码随想录训练营第四十六天|139.单词拆分、多重背包、背包总结

思考:本题的本质是求完全背包是否有一个排序能够装满背包的问题。本题的物品是一串字符串,因此遍历时主要是取s的[i, j]之间字符串来找物品中是否存在(find的用法是在使用unordered_set对s进行排序后),并且还要满足dp[i]也是true,即要满足dp[j] = true的话,dp[i]要在对于的字符串,s[i, j - i]字符串也在单词中可以找到。

2023-08-28 16:14:44 89

原创 代码随想录第四十五天|70. 爬楼梯 (进阶)、 322. 零钱兑换、279.完全平方数

思考:本题是完全背包求解装满背包容量为amount所需要的最小物品(硬币)数目,本题不涉及到排序与组合问题,因此物品和背包遍历顺序可以颠倒,注意初始化时除了dp[0] = 0之外,其他的数都初始化为INT_MAX,如果dp[0]没有初始化为0的话,无法比较,都是INT_MAX,由于dp[j - coins[i]] 会为INT_MAX,因此为了防止dp[j - coins[i]] + 1越界,除了j >= coins[i],dp[j - coins[i]]!基本思路:如上,注意初始化dp[0] = 0;

2023-08-27 17:47:45 163

原创 代码随想录第四十四天|完全背包、518. 零钱兑换 II 、 377. 组合总和 Ⅳ

小节:完全背包和0-1背包不同的地方是完全背包中的物品可以取无限次,而0-1背包的物品只能取一次,因此完全背包在进行遍历时都是从小到大进行遍历(原因在0-1背包中说过,从前往后,可以多次取物品);如果要考虑装满背包的方法次数问题的话,有两种情况,情况一是组合问题,那么此时先遍历物品,再遍历背包,这是背包中的物品都是按着下标从大到小进行排列的,如{1, 5},情况二是排序问题,先遍历背包,再遍历物品,此时背包中的物品会有成组的下标,如{1, 5}和{5, 1},这是两种不同的方法(这一种我现在还没搞懂)。

2023-08-25 20:20:18 50

原创 代码随想录第四十三天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

本题的本质是寻找两个和最近的子集,因此主要思路是将取数组和的一半作为背包容量target,然后使用一维背包的状态转移公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])来获取dp[target]的值,先遍历stones,再从后往前遍历target,遍历时j >= num[i],注意最后返回值为sum - 2 * dp[target]。基本步骤:步骤比较简单,比较难的是如何理解这个二维背包,自己可以画一画,就是滚动矩阵,把状态转移公式理解并记住即可。

2023-08-24 21:47:01 148

原创 代码随想录训练营第四十二天|0-1背包理论基础(一)、0-1背包理论基础(二)、416分割等和子集

代码随想录训练营第四十二天|0-1背包理论基础(一)、0-1背包理论基础(二)、416分割等和子集

2023-08-23 20:19:42 163

原创 代码随想录训练营第四十一天|343.整数拆分、96.不同的二叉搜索数

代码随想录训练营第四十一天|343.整数拆分、96.不同的二叉搜索数

2023-08-21 20:50:49 40

原创 代码随想录训练营第39天|62.不同路径、63.不同路径Ⅱ

代码随想录训练营第39天|62.不同路径、63.不同路径Ⅱ

2023-08-20 15:32:25 134

原创 代码随想录第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

2023-08-17 19:32:29 100

原创 代码随想录第三十七天|738.单调递增的数字、968.监控二叉树

代码随想录第三十七天|738.单调递增的数字、968.监控二叉树

2023-08-17 19:07:40 77

原创 代码随想录第三十六天|435.无重叠区间、763.划分字母区间、56.合并区间

代码随想录第三十六天|435.无重叠区间、763.划分字母区间、56.合并区间

2023-08-16 11:56:37 31

原创 代码随想录第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

代码随想录第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

2023-08-15 15:40:53 105

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

代码随想录训练营第三十四天|1005.K次取反后最大化的数组和 、134. 加油站、135. 分发糖果

2023-08-14 15:31:41 24

原创 代码随想录训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

代码随想录训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

2023-08-12 12:31:44 119

原创 代码随想录训练营第三十一天|455.分发饼干、 376. 摆动序列 、53. 最大子序和

代码随想录训练营第三十一天|455.分发饼干、 376. 摆动序列 、53. 最大子序和

2023-08-11 16:25:09 33

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

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

2023-08-10 16:28:30 186

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

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II

2023-08-09 15:44:15 27

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

要明确本题求子集与组合题之间的区别,组合题是从数组中找到集合求和为target,最终在叶子节点中寻找结果,而求子集不一样,求子集是要找到一个数组中的所有子集集合,把一个数组中的所有子集树列出,其中的每个节点都是要收取的结果。思考:本题和上一题的区别在于本题存在重复元素,因此在求取子集时需要考虑去重问题,本题的去重方法和组合总和Ⅱ一样,首先对数组进行排序,然后通过used标记已经使用过的元素,如果数组中存在相邻且相同的数,并且前一个未被使用过,那么就可以去重,卡哥称之为树层去重。

2023-08-08 15:42:07 22

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

代码随想录算法训练营第二十七天| 39. 组合总和、 40.组合总和II、131.分割回文串

2023-08-07 21:25:26 31

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

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

2023-08-05 15:30:57 37

原创 代码随想录算法训练营第二十四天|理论基础、77.组合

代码随想录算法训练营第二十三天|理论基础、77.组合

2023-08-04 21:15:40 38

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

单层迭代逻辑中,根据平衡二叉树的特点,因此在划分左右子树时,从数组中间开始划分, 用数组中间的元素创建父节点,再对左右区间进行划分,并作为父节点的左右子树继续递归;二叉搜索树的性质应用主要体现在单层递归时,如果当前节点的val不存在指定范围内,如果小于,则递归节点右子树,并返回;基本思路:把题目看明白了,很容想到右中左遍历,在单层递归逻辑中,处理中的时候,记得更新节点val和preVal的值。思考:中止条件中不能写成left == right,再返回节点,因为漏掉了left < right的情况。

2023-08-03 11:04:48 30

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

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

2023-08-02 11:56:51 25

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

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

2023-08-01 12:23:30 34

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

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

2023-07-31 11:16:06 31

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

首先是确定递归函数,中序和后序数组;最后是单层迭代逻辑,也是重头戏,根据后序数组的最后一个元素从中序数组中找到该元素,并记录该元素的index,则开始分割,左边为左前序数组,右边为右前序数组,根据左前序数组的元素个数再从后序元素中分割数组为左后序数组,右后续数组,父节点的左子节点左前序数组和左后序数组进行递归,右子节点用右前序数组和右后序数组递归即可,最后返回父节点。最后要注意的是,只要找到一条满足路径综合条件的路径,就满足题意了,因此每次左右递归时,会进行判断,满足条件,就直接return true。

2023-07-29 20:05:16 40

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

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

2023-07-28 17:58:27 78 1

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

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

2023-07-27 16:12:27 37 1

空空如也

空空如也

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

TA关注的人

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