自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 八股训练营总结

2024-08-17 21:45:09 234

原创 代码随想录算法训练营29期|day64 任务以及具体安排

思路:该题和接雨水类似,要求左面和右面较小的值,然后相减求出宽度,然后乘以h,利用单调栈求左右较小的值。注意要在数组前后加0,确保数组前后的数左右都能有比i小的值。有了之前单调栈的铺垫,这道题目就不难了。第十章 单调栈part03。84.柱状图中最大的矩形。

2024-02-27 23:40:43 441

原创 代码随想录算法训练营29期|day63 任务以及具体安排

思路:接雨水问题是高频面试题,主要是单调栈的应用,要知道是横向考虑,进行行计算,求i左面比i大的值和右面比i大的值,然后求最小值和i的值相减,并且求宽度,然后相乘,加入到result中。思路:该题和每日温度的题几乎一模一样,区别在于该题能首尾相接,可以循环取值,于是可以让i<2*size,然后每次取i时取模于size。503.下一个更大元素II。第十章 单调栈part02。

2024-02-27 12:17:43 319

原创 代码随想录算法训练营29期|day62 任务以及具体安排

第十章 单调栈part01739. 每日温度思路:单调栈的应用,单调栈解决左面或右面第一个大或小的元素,其实就是自己模拟单调栈。

2024-02-26 13:14:09 986

原创 代码随想录算法训练营29期|day60 任务以及具体安排

如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。关于动态规划,在专题第一篇关于动态规划,你该了解这些!就说了动规五部曲,而且强调了五部对解动规题目至关重要!这是Carl做过一百多道动规题目总结出来的经验结晶啊,如果大家跟着「代码随想哦」刷过动规专题,一定会对这动规五部曲的作用感受极其深刻。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。

2024-02-24 11:39:02 928

原创 代码随想录算法训练营29期|day59 任务以及具体安排

本周我们讲了动态规划之终极绝杀:编辑距离,为什么叫做终极绝杀呢?细心的录友应该知道,我们在前三篇动态规划的文章就一直为 编辑距离 这道题目做铺垫。心思的录友应该会发现我用了三道题做铺垫,才最后引出了动态规划:72.编辑距离 (opens new window),Carl的良苦用心呀,你们体会到了嘛!

2024-02-23 12:49:20 1283

原创 代码随想录算法训练营29期|day58 任务以及具体安排

思路:该题属于编辑距离问题,就是要求s字符串能删几种情况变为t字符串,dp数组表示i-1中包含j-1的情况数目,递推公式分为s[i-1]==t[j-1]和不等的时候,相等的情况下,dp[i][j] = dp[i-1][j-1]+dp[i-1][j],前者代表用s[i-1]后者表示不用s[i-1]的情况,将两者相加。思路:该题与求两数组的最长公共子序列几乎是一模一样,只需要略微改变递推公式,dp[i][j] = dp[i][j-1],因为要求的是s是否是t的子序列。第九章 动态规划part15。

2024-02-22 12:05:29 228

原创 代码随想录算法训练营29期|day57 任务以及具体安排

思路:该题的dp数组表示0到i-1,j-1的最长公共子序列,递推公式:如果char1和char2相等的话,就在dp[i-1][j-1]的基础上+1,不相等的话就取相邻的最大值。思路:该题较为简单,类似于递增连续子序列,明确dp数组表示以nums[i]结尾的最大自序和,递推公式也很简单,就是要求加上nums[i]和nums[i]自身的最大值。53. 最大子序和 动态规划。思路:该题和上题的解法一模一样。第九章 动态规划part14。1143.最长公共子序列。1035.不相交的线。

2024-02-21 12:16:55 219

原创 代码随想录算法训练营29期|day56 任务以及具体安排

思路:确定dp数组,dp数组表示i-1,j-1的最长重复子数组,关键是表示i-1和j-1的子数组。然后就确定递推公式,遍历nums1和nums2,如果相等的话,就在i-1、j-1的基础上加1,用result保存最长的公共子数组。思路:该题为典型的动态规划题目,首先要明确dp数组的含义,dp数组表示结尾为nums[i]的最大子序列,因此递推公式就是要求比i小的dp数组+1和dp[i]的max值。思路:该题与上一题类似,是上一题的特殊情况,必须为连续的递增子序列,所以只需要和前一个nums比较。

2024-02-20 16:49:26 529

原创 代码随想录算法训练营29期|day55 任务以及具体安排

第九章 动态规划part12309.最佳买卖股票时机含冷冻期思路:分为四种状态进行讨论,所以需要二维数组,0代表持有股票的最大金额,1代表保持卖出状态的最大金额,2表示卖出股票的最大金额,3表示冷冻的最大金额,然后进行递推公式的推导,进行dp数组的初始化。714.买卖股票的最佳时机含手续费思路:该题和买卖股票2基本类似,就是需要减去手续费。总结之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了!

2024-02-20 00:06:56 1799

原创 代码随想录算法训练营29期|day54 任务以及具体安排

思路:该题与上题的区别在于该题是至多能k次,所以二维数组需要2*k+1的维度,1、3、5等奇数代表持有股票,2、4、6等偶数代表不持有股票。然后根据递推公式进行遍历递推。再进行dp数组的初始化。思路:于上两个股票买卖问题的区别在于这道题限制了买卖次数,需要定义五种状态:0、1、2、3、4来代表不同的状态。然后使用递推公式对dp数组进行更新。123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。第九章 动态规划part11。

2024-02-19 22:04:12 300

原创 代码随想录算法训练营29期|day53 任务以及具体安排

思路:该题可以使用贪心、暴力、动态规划解决,本解法使用动态规划,确定dp数组为二维数组,代表第i天持有和不持有股票的最大金额,确定递推公式,确定持有股票的递推公式和不持有股票的递推公式。思路:于上一题的区别就是本题可以多次买卖股票,dp数组、遍历顺序都一样,就是持有股票的递推公式发生了变化,当天i买股票的钱为前一天不持有股票的最大金额减去买股票的钱。122.买卖股票的最佳时机II。121. 买卖股票的最佳时机。第九章 动态规划part10。

2024-02-17 09:56:20 252

原创 代码随想录算法训练营29期|day52 任务以及具体安排

思路:该题和上题的区别就是一个环,首尾不能连上,所以需要分情况讨论,包含首节点不包含尾节点和不包含首节点包含尾节点的两种情况。然后求两种情况的最大值。思路:本题是典型的动态规划题目,dp数组表示到第i家时,能偷到的最大金额。递推公式为偷i和不偷i的最大值。思路:用dp[0]和dp[1]代表取该节点和不取的情况,用后序遍历推导递推公式,分两种情况讨论。第九章 动态规划part09。213.打家劫舍II。337.打家劫舍III。

2024-02-16 12:06:52 262

原创 代码随想录算法训练营29期|day51 任务以及具体安排

年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序。

2024-02-15 12:18:47 1023

原创 代码随想录算法训练营29期|day50 任务以及具体任务

思路:该题是完全背包问题,dp数组表示装满j需要的最少物品。该题不需要考虑组合或者排序,先遍历背包或者物品都可以。思路:该题和背包问题一样,n为背包大小,1到m为物品的大小,要求装满背包有几种方法,而且是可以重复取物品。思路:这道题和上一题思路一样,都是要求最小组成数,只不过是物品发生了变化。第九章 动态规划part07。70. 爬楼梯 (进阶)

2024-02-14 10:07:02 245

原创 代码随想录算法训练营29期|day44 任务以及具体任务

就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。思路:与上题一样,本题是求解排列,讲究顺序,211和112不一样,先遍历背包在遍历物品,这样的话就有顺序之分。思路:该题与494.目标和的题目类似,都是求组合的组数,该题的区别就是多重背包,可以放多个相同的物品。

2024-02-08 17:01:24 762

原创 代码随想录算法训练营29期|day43 任务以及具体任务

思路:01背包的思路,dp数组表示能装满j有几种方案。递推公式和01背包类似,表示加上装进去nums[i]的dp[j - nums[i]]。初始化:将dp[0]初始化为1。思路:相当于两个维度的背包m和n,要考虑两个背包,dp数组表示i个0和j个1的最大子集。递归遍历strs字符串数组,然后倒序遍历m和n,确定递推公式。思路:典型的01背包问题,dp[]数组表示指定背包容积所能放的最大石头重量,递推公式就是典型的01背包,初始化dp数组为0.1049. 最后一块石头的重量 II。

2024-02-07 19:40:43 304

原创 代码随想录算法训练营29期|day42 任务以及具体任务

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

2024-02-06 21:11:04 726

原创 代码随想录算法训练营29期|day41 任务以及具体任务

思路:确定dp数组的含义:dp数组是确定i拆分的最大乘积,确定递推公式,主要思想是把i拆分成j*(i-j)和j*dp[i-j],然后取最大值,不需要把j也拆分,因为首先j=1,如果后面拆分成1,都是和j=1的拆分一样,后边的数字同理。思路:首先就是要确定dp数组的含义:dp数组表示有i个节点的二叉搜索树的种类,递推公式就是遍历1到i作为父节点,然后左子树的种类乘以右子树的种类,然后将所有的都加起来,作为dp[i]。第九章 动态规划part03。96.不同的二叉搜索树。

2024-02-05 12:57:16 224

原创 代码随想录算法训练营29期|day39 任务以及具体任务

第一行和第一列,只要出现障碍,后边的dp数组都为0;因为第一行和第一列都是由前面走出来的,只要前面出现了障碍,后面都走不通。如果起点或者终点出现了障碍,直接返回0。思路:该题是动态规划的经典题目,关键是动态规划五部曲的应用,首先要确定dp数组和其含义,确定递推公式,初始化dp数组,确定遍历顺序,最后举例推导dp数组。第九章 动态规划part02。63. 不同路径 II。

2024-02-03 12:58:41 258

原创 代码随想录算法训练营29期|day38 任务以及具体安排

思路:按照动态规划五部曲:(1)确定dp数组以及下标的含义(2)确定递推公式(3)确定dp数组如何初始化(4)确定遍历顺序(5)举例推导dp数组。思路:该题与上一题类似,区别就是要求前一步和前两步的最小值进行计算。:主要是递推公式的确定,dp数组的含义与斐波那契类似。746. 使用最小花费爬楼梯。509. 斐波那契数。

2024-02-02 21:01:13 411

原创 代码随想录算法训练营29期|day38 任务以及具体安排

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,在关于贪心算法,你该了解这些!中我举了一个背包问题的例子。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

2024-02-02 16:22:14 2051

原创 代码随想录算法训练营29期|day37 任务以及具体任务

我刚刚开始讲解贪心系列的时候就说了,贪心系列并不打算严格的从简单到困难这么个顺序来讲解。因为贪心的简单题可能往往过于简单甚至感觉不到贪心,如果我连续几天讲解简单的贪心,估计录友们一定会不耐烦了,会感觉贪心有啥好学的。但贪心的难题又真的有点难,所以我是简单困难交错着讲的,这样大家就感觉难度适中,而且贪心也没有什么框架和套路,所以对刷题顺序要求没有那么高。但在贪心系列,我发的题目难度会整体呈现一个阶梯状上升,细心的录友们应该有所体会。

2024-02-01 15:49:58 1108

原创 代码随想录算法训练营29期|day36任务以及具体安排

思路:寻找一个区间内的最大距离,使得每个区间内的字母都跑不出这个区间,这就是一个结果集,用edge数组保存各个字母的最远距离,一旦i遍历到idx区间内的最远距离时,就把这个区间长度加入结果集list中。思路:和上题射气球思路一样,都是要寻找重合区间,如果有重合区间就result++,并且更新右边界。思路:与前几道题类似,都是要求重合区间,然后合并起来,注意!要取右边界的最大值!第八章 贪心算法 part05。435. 无重叠区间。763.划分字母区间。

2024-01-31 19:28:21 499

原创 代码随想录算法训练营29期|day35 任务以及具体任务

思路:先对points进行排序,比较当前气球的左边界和前一气球的右边界,如果当前气球的左边界大于前一气球的右边界就需要一个箭,else就把min(points[i][1], points[i-1][1])赋值给当前气球的右边界。思路:关键是先安身高从大到小排序,然后ki的值其实就是在list中的位置,将重新排好的数组根据ki插入。思路:该题思路较为简单,就是用三个变量来记录三种货币的数量。452. 用最少数量的箭引爆气球。406.根据身高重建队列。

2024-01-30 19:36:36 299

原创 代码随想录算法训练营29期|day34 任务以及具体任务

思路:要把左右孩子分开比较,一起比较容易顾此失彼,而且!要先从前往后,再从后往前,把最近更新的都利用上,从后往前更新时,要将原糖果数和candy[i+1]+1相比较,取满足条件的最大值。思路:把每个点的存储或消耗的油量算出来,如果从一个点走到另一个点curSum<0,那么就从i+1出发,只要totalSum>0,总有一个点可以当出发点。思路:让绝对值最大的负数变为正数,如果负数都变为正数了,k还大于0,就把最小的正数反复×负号。1005.K次取反后最大化的数组和。

2024-01-29 17:47:01 291

原创 代码随想录算法训练营29期|day32 任务以及具体安排

思路:更新覆盖范围,如果覆盖范围>=最后一个点的位置,就return true,注意!要在覆盖范围内更新,最典型的例子:0 1 1 1 1这种情况肯定到不了最后。思路:走到当前覆盖的最大区域时,走一步然后更新为当前最大覆盖范围。如果当前最大覆盖范围已经覆盖最后一个数时,就走一步,到达最后一个数。思路:将股票问题抽象为每天买卖的情况,两天之间只要有钱赚,就买入卖出,达到局部最优的情况。122.买卖股票的最佳时机II。第八章 贪心算法 part02。

2024-01-27 17:31:14 319

原创 代码随想录算法训练营29期|day31 任务以及具体安排

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。

2024-01-26 18:00:35 801

原创 代码随想录算法训练营29期|day30 任务以及具体安排 回溯总结篇

代码随想录」 (opens new window)历时21天,14道经典题目分析,20张树形图,21篇回溯法精讲文章,从组合到切割,从子集到排列,从棋盘问题到最后的复杂度分析,至此收尾了。这里的每一种问题,讲解的时候我都会和其他问题作对比,做分析,确保每一个问题都讲的通透。可以说方方面面都详细介绍到了。如何理解回溯法的搜索过程?什么时候用startIndex,什么时候不用?如何去重?如何理解“树枝去重”与“树层去重”?去重的几种方法?如何理解二维递归?

2024-01-25 13:30:01 1178

原创 代码随想录算法训练营29期|day30 任务以及具体安排

332.重新安排行程。

2024-01-25 13:18:06 382

原创 代码随想录算法训练营29期|day29 任务以及具体安排

思路:与子集问题类似,但是不能进行排序,因为需要挑出递增数列。进行树层去重和树枝去重,树枝去重需要比较path的最后一个和当前要加入的大小。思路:在全排列的基础上增加了树层去重,先对nums数组进行排序,然后根据used进行树层去重,并且和全排列一样进行树枝去重。思路:全排列问题相对简单,就是进行树枝去重,i每次从0开始,只要used[i] == true,就跳过。解法二:通过判断path是否存在数字,排除已经选择的数字。* 491.递增子序列。* 47.全排列 II。

2024-01-24 17:39:07 385

原创 代码随想录算法训练营29期|day28 任务以及具体安排

思路:和 40.组合总和II方法一样,都是要进行树层去重。关键是used数组的使用,要确保used[i-1]==false;然后就是每个节点都收获结果。思路:与day27的分割回文子串类似,主要是要理解isVaild的思路,当dotCount == 3时,还要进行判断,然后将符合的加入result中。思路:和分割问题类似,主要区别是要在每个节点收获结果,所以result.add(new ArrayList<>(path)要放在最上面。

2024-01-23 22:08:50 471

原创 代码随想录算法训练营29期|day27 任务以及具体安排

思路:回溯思路与上题差不多,主要是去重的操作,去重分为树枝去重和树层去重,本题是树层去重,同一层的数据,与前一个数据相等时,去重(跳过),用used[i-1]==false保证是同一层的而不是同一个树枝。思路:该题和组合问题类似,主要是要理清startIndex代表分割位置的思想,相当于画线操作,当一个区间为回文串的时候,add进path中,回溯终点是startIndex==s.length()

2024-01-22 18:54:31 581

原创 代码随想录算法训练营29期|day 25 任务以及具体安排

思路:回溯的基本模板,关键是剪枝的操作,if(sum > targetSum)进行剪枝,9-(k - path.size())+1进行剪枝。思路:要把数字对应为字符串,将num作为遍历第几个数字的标识,递归num++,往深遍历,for循环是往宽遍历,遍历一个数字对应的所有字符。17.电话号码的字母组合。216.组合总和III。

2024-01-20 19:34:11 626

原创 代码随想录算法训练营29期|day 24 任务以及具体安排

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。

2024-01-19 18:14:39 945

原创 代码随想录算法训练营29期|day 23 任务以及具体安排

本题的关键是要明白删除节点,不能直接返回null,要考虑如果是小于low的话,要考虑删除节点的右子树,如果大于high的话,要考虑删除节点的左子树。思路:本题的关键是右中左的遍历顺序,用一个指针sum记录前一个节点的值,与当前节点相加。思路:每次取中间的值作为父节点,然后遍历middle左边的区间和右边的区间。本题相对比较简单,关键是思考清楚begin和end的开闭情况。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。

2024-01-18 14:26:26 605

原创 代码随想录算法训练营29期|day 22 任务以及具体安排

该题的关键是要考虑五种情况:1、没有找到key 2、key在叶子节点 3、key所在的节点左子树为空,右子树不为空 4、key所在的节点左子树不为空,右子树为空 5、左右子树都不为空。该题的关键是利用二叉搜索树的特性,从上往下遍历,要知道第一个在p和q之间的节点就是最近公共祖先,因为不管向右遍历还是向左遍历,都会丢失p或者q。该题的关键是知道把值插在叶子节点的左右,当root==null时,就是插入的时机。235. 二叉搜索树的最近公共祖先。701.二叉搜索树中的插入操作。450.删除二叉搜索树中的节点。

2024-01-17 20:39:50 579

原创 代码随想录算法训练营29期|day 21 任务以及具体安排

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]提示:树中至少有 2 个节点。

2024-01-16 18:06:18 493

原创 代码随想录算法训练营29期|day 20 任务以及具体安排

主要就是利用中序遍历,比较当前遍历的数值与前一位的数据的大小,用pre指针指向前一位。与day19任务类似,都是要构建二叉树,必须用前序遍历。操作两个二叉树,改变一个二叉树就可以。主要就是利用二叉搜索树的特点遍历。700.二叉搜索树中的搜索。98.验证二叉搜索树。

2024-01-15 18:58:31 1161

原创 代码随想录算法训练营29期|day 18 任务以及具体安排

513.找树左下角的值。

2024-01-13 23:06:45 908

空空如也

空空如也

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

TA关注的人

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