自定义博客皮肤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)
  • 收藏
  • 关注

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

在开头位置加0是为了解决单调减的柱高数组,如果是[8,6,4,2]的柱高数组,不前置0的话,先是将8入栈,当6入栈时不满足单调递减栈的条件,将8弹出栈,但此时栈已经为空,不会计算以8为高度的矩形面积,直接执行6入栈,后面的入栈操作也会是这样。具体做法就是寻找当前柱子左侧第一个更低的柱子和右侧第一个更低的柱子,记录两者的下标计算宽度,高度就是当前柱子的高度,这样就能计算出矩形的面积。这与接雨水正好是相反的,接雨水是要形成凹槽,这道题则是形成两边低中间高的形状,这样应该用单调递减栈。更低的柱子,同时记录下标。

2024-02-28 14:54:11 340

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

这道题与昨天的题相比,数组是循环数组。我们可以用下标取余的方法来解决循环数组问题。

2024-02-27 15:25:31 343

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

如果我们单纯的遍历数组,我们不知道当前元素是否比之前的元素大,所以需要维护一个容器来记录遍历过的元素。什么时候用单调栈?。时间复杂度为O(n)。这道题的单调栈应该是递增栈还是递减栈呢(从栈头到栈底)?这道题是求右边第一个比自己大的元素的位置,小于等于栈顶元素时当前元素下标应该入栈;遇到大于栈顶元素的情况,应该记录当前元素与栈顶元素下标差,,并弹出栈顶元素,重复操作直到当前元素小于等于栈顶元素,此时将当前元素下标入栈。由此可知,求右边第一个比自己大的元素的位置,应该维护从栈头到栈底的递增栈。

2024-02-26 13:05:45 370

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

这道题主要难在dp数组的定义以及递推关系的构建。如果直接用 dp[i] 表示[0,i]子串中包含的回文串的数目,是无法找到递推关系的。通过回文串的性质可以构造这样的递推关系:对于判断[i,j]是否是回文串,如果s[i] == s[j],只需要考察[i+1,j-1]是否回文串;如果s[i]!= s[j],一定不是回文串。因此构建 dp[i][j] 表示下标范围是[i,j]的子串是否是回文串。由于初始没有进行匹配,都初始化为false即可。对于遍历顺序,[i+1,j-1]推导[i,j]。

2024-02-25 16:40:18 373

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

dp[i][j] 表示使得[0, i-1]的word1子串和[0, j-1]的word2子串相同所需要的最小步数。递推公式:也是分为word1[i-1]和word2[j-1]相不相等两种情况。如果相等则不需要修改,dp[i][j] = dp[i - 1][j - 1]。如果不相等,要么删除word1[i-1],要么删除word2[j-1],则dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1。(两个都删除的情况已经包含在其中了)初始化按照dp数组含义即可。

2024-02-23 12:33:17 355

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

这道题可以双指针方法解决。用动态规划也是可解的,是简化的编辑距离问题。通过删除 t 中的字符得到 s,求解能否实现。dp[i][j] 表示 i-1 之前的字符串s子串和 j-1 之前的字符串t子串之间的最长公共子序列长度。这道题与上一道最长公共子序列是相同的。int。

2024-02-22 22:59:06 373

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

当进行遍历递推时,无非有。

2024-02-21 13:55:13 355

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

这里dp数组的定义比较难想。,只有这样才能实现状态递推。对于dp数组初始化,所有下标位置都应该初始化为1。

2024-02-20 18:57:06 358

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

股票题做到这地步,可以发现分析每一天的可能状态与状态之间的转换是解决问题的关键。而状态之间的转换决定了dp数组的递推公式:对于状态1,一种情况是从前一天继续保持状态,第二种情况是从状态2买股票转化而来,第三种情况则是从状态4买股票转化而来,状态3是当天卖出股票,第二天就是冷冻期,因此不能从状态3转化而来。对于状态2,一种情况是从前一天继续保持状态,第二种情况则是从状态4转化。对于状态3,当天卖出股票,从状态1转化而来。对于状态4,从状态3转化。

2024-02-20 01:09:32 371

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

所以设计的 dp 数组应该有5个维度,分别计算可能得到的最大利润。对于如何递推,是类似于昨天的股票问题的。对于初始化dp数组,第一次持有与不持有与之前都是一样的,。第二次持有与不持有在第0天可以看做第一次持有又在当天卖出,这样就出现了第二次的持有与不持有,此时。最终应该返回什么作为最大利润呢?应该返回 dp[i][4]。这个值其实包括了只交易一笔 dp[i][2] 的情况(相当于当天买当天卖完成第二次的持有)。int。

2024-02-19 12:36:38 362

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

可以用贪心算法来解决。也就是从左向右维护股票价格的最小值,从而可以得到最大的利润。动态规划思路,dp数组的含义感觉不好想。dp[i][0] 表示第 i+1 天持有股票能获得的最大利润,dp[i][1] 表示第 i+1 天不持有股票能获得的最大利润。对于递推公式,第 i+1 天持有股票可以分为之前就持有股票维持状态 dp[i-1][0],以及当天买入股票 -prices[i]。

2024-02-19 00:07:41 302

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

关键点在于当前的房屋偷不偷,这取决于前一个房子有没有被偷,在确保前一个房子不被偷可以偷一下当前的房子。

2024-02-18 13:30:08 388

原创 代码随想录算法训练营第51天 | 139.单词拆分 多重背包理论基础

这道题最后是判断能否组成,很像回溯法的问题形式,和分割回文串那道题比较类似,所以是可以用回溯法解决的,但是回溯法需要使用来避免超时。

2024-02-16 00:35:33 382

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

这道题其实可以抽象为完全背包问题,要爬的总台阶数就是背包容量,一次能爬的台阶数目就是要装入背包的物品,物品可以无穷次使用。同时要注意这道题要求的是排列方法数目,要注意背包和物品的遍历顺序。

2024-02-15 11:11:17 311

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

完全背包与01背包只相差在物品是无限取用的。因此和01背包相比第二层对背包容量的遍历应该是正序的,而且正因为这个正序,使得在中,背包容量和物品的遍历是可以倒过来的。

2024-02-11 00:36:58 358

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

若要让剩余的石头重量最小,只需要将石头分成重量近似的两堆。因此我们将石头总重量的一半作为背包容量,希望装进来的石头能尽量将背包填满。这就转化成了分割等和子集那道题的思想。

2024-02-09 00:52:19 353

原创 代码随想录算法训练营第42天 | 01背包理论基础 416.分割等和子集

int。

2024-02-07 23:57:30 431

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

对于初始化,如果只有一个节点,二叉搜索树的数目只有1,同时0个节点也是合法的,因为空树也是二叉搜索树,当1为头节点时,其左叶子应该为空,右叶子应该有两个节点2、3,这种情况的树的数目应该为。以 n=3 为例,我们在思考这一问题时可以分别以1、2、3为头节点构建二叉搜索树。当2为头节点时,其左叶子应该为1,右叶子应该有两个节点3,这种情况的树的数目应该为。当3为头节点时,其左叶子应该为2、3,右叶子应该为空,这种情况的树的数目应该为。假设 dp[i] 表示有 i 个节点时能构造出的二叉搜索树的数目。

2024-02-07 00:33:22 352

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

可以图论中的深度优先搜索,可以将每一次的选择抽象为二叉树的两个子节点,这样所有的路径集合就被抽象成了一棵二叉树,求的路径数目就是二叉树叶子节点的数目。树的层数为 m+n-1,深搜近似遍历了树的所有节点,因此程序的时间复杂度近似于指数级,是会超时的。动态规划实现如下,其实还可以用滚动数组的方式进一步做空间优化,当前的状态只与左侧和上面的状态有关,可以只用一个一维数组表示,其自身就是上次遍历(上一行)的值,只需要加上左侧的值就可以得到这次遍历(本行)的值。int。

2024-02-03 18:15:08 910

原创 代码随想录算法训练营第38天 | 动态规划理论基础 509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯

动态规划适用于解决有重叠子问题的问题。所以动态规划中的每一个状态一定是由上一个状态推导来的,这一点区分于贪心,因为贪心每一步总是取局部最优。关于动态规划的debug:围绕dp数组展开,举例对dp数组的取值进行模拟,打印日志查看是否与预想一致。

2024-02-02 15:34:40 593

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

这道题思路挺巧妙的。举个例子,332这个数,会出现这种非单调递增的情况,这时需要将,然后给strNum[i]赋值9,这样既保证了两位数字之间的递增关系,同时也使得数字减小的最少。

2024-02-02 00:51:12 421

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

这道题按左边界排序和右边界排序都是可以的。主要就是要统计出不重合区间的数目。如果按照右区间排序,下面这张图十分形象:这样去掉一组重叠区间后,剩下的那个区间它的右端点最小,能让后面产生尽量多的不重叠空间。。

2024-01-31 10:16:02 369

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

局部最优:收到20元时优先找零10元+5元,不够再找零3个5元,因为5元可以找零20和10,更有用。全局最优:完成所有的找零。

2024-01-30 16:02:21 354

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

贪心局部最优:将大的负数变为正数,当前和变为最大;全局最优:整体获得最大和。如果负数都变成正数之后,k > 0,仍然需要继续翻转,贪心局部最优:将最小的正数翻转,当前和变为最大;全局最优:整体获得最大和。

2024-01-29 15:44:47 359

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

要想使用贪心算法解决此问题,意识到利润是可分解的很关键。比如[1,2,3,4,5]这个输入,最大利润为第一天买入,第五天卖出。这等效于第一天买入,第二天卖出,第二天再买入。。。所以总利润的最大值等于所有头天买第二天卖的正利润之和,局部最优组成了全局最优,可以用贪心算法。

2024-01-28 22:21:58 419

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

选取每一阶段的局部最优,堆叠成全局最优。遇到求最优解问题时,可以先手动模拟一下,将问题分解,举例分析小问题的局部最优是否能达到全部最优,能的话就可以试一下贪心算法。贪心算法的题没有固定的套路和判别方法,基本就是靠常识和手动模拟的方式。其实算法书中有数学推导,但在面试刷题中用不着。

2024-01-28 13:39:40 377

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

这道题难点在于寻找合适的容器,来实现已知起点后的路径遍历递归与回溯,记录好起点与终点之间的映射关系。因为我们要优先挑选字母序小的路径,所以在上面说的起点向终点的映射中,终点最好按字母序排好,这样我们每次优先选择的都是字母序小的,一旦找到了一条合法路径,就能保证这条路径的字母序最小。容器内的元素是有序的,我们可以想到map或者multiset这样的容器,为什么是multiset不是set呢?因为给出的机票是可能重复的,存在一个起点多次达到同一个终点的机票,元素可能重复,所以选择的是 multi 的。

2024-01-27 12:23:07 325

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

这道题与子集II比较相似,子序列也是子集,而且这里数组中也包含重复元素。但是这道题要有序的序列,所以不能对原来的数组先进行排序。但我们前一篇文章总结过:子集问题中涉及重复元素时,是需要排序的。这里还需要细化总结一下,树层去重可以做到去除元素和排列顺序都相同的组合,无法去除 [4,1,4] 和 [4,4,1] 这样顺序不同的情况。而经过排序之后这个问题就解决了,这道题本身就限制了元素顺序,所以只要能去除元素和顺序都相同的重复组合就行了。

2024-01-25 19:04:32 356

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

这道题也是分割问题。但是这道题最后求的是字符串数组,所以可以直接在原字符串上插入逗点。分割的模拟不用多说,用 [startIndex, i] 来模拟分割字符段。当逗点数目达到3时就可以判断递归结束。同时还要实现一个判断字段是否有效的函数。这个代码里坑还是挺多的,stoi函数容易有很多错误,注意 int 型范围。判断合法函数中也要加上的判断,因为可能逗点添加在字符串的末尾了,导致 start(i+2)比 end 大。

2024-01-25 13:25:30 348

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

注意这道题组合中元素数目不定,同时数组中的元素可以使用无限多次。虽然数目不定,但还是题中仍然给出了总和的限制,我们可以用总和作为递归终止条件。数组中的元素可以使用无数次,这与之前的题目不同,决定了这道题 startIndex 不同于之前的题目。关于 startIndex:当从一个集合中取元素进行组合时,为了去重的需要,是要有 startIndex 的;如果每一次取元素来自不同集合,而且多个集合彼此相互独立,就不需要有,比如电话那道题。对于这里对总和进行剪枝,要注意先排序。

2024-01-24 16:19:31 390

原创 代码随想录算法训练营第四天 | 24.两两交换链表中的节点 19.删除链表的倒数第N个节点 160.链表相交 142.环形链表II

两两交换节点,思路如下:这样三步操作就实现了2和1两个节点的交换,循环操作,每一次循环移动到交换好的最后一个节点。循环的截止条件就是没有节点剩余了,或者只剩一个节点。翻转链表的精髓还是在于暂存原链表中的 next 指针,然后再改变 next 指针的指向。

2024-01-21 15:18:59 351

原创 代码随想录算法训练营第三天 | 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

之前我们做过一道移除链表元素的题,其难点在于数组连续存储,所以移除元素之后还需要移动其他元素保证连续。但是链表不需要保证连续存储,移除操作与其他元素无关的,其实我们直接遍历整条链表就可以了。处理过程需要注意的问题:头节点与其他节点不同的处理办法。其他节点都是改变前一个节点的指针指向,但删除头节点的话需要不断向后更新头节点。

2024-01-20 18:36:49 529

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

这道题与昨天的组合问题没有太大区别,只需要添加一个加和等于目标和的条件,同时也可以根据这个目标和进行剪枝。

2024-01-20 15:41:09 430

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

回溯是递归的副产品,有递归就会有回溯。。。要解决的问题都可以看做在集合中找子集,集合的大小构成了树的宽度,递归的深度就是树高。抽象如下:回溯函数其实就是递归函数,模板其实与递归也差不多。

2024-01-20 11:28:55 414

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

这道题感觉有点难理解,需要反复看。难点在于我们不能单单找到小于 low 或大于 high 的节点就删除整个子树,还需要关注该节点的右子树是不是还有符合的节点。迭代法,仍然是要注意不能单单因为当前节点不符合条件就扔掉整个子树,仍需要遍历它的左子树或者右子树来寻找符合条件的节点。也不能因为当前的节点符合条件就不处理子树,需要遍历左子树或者右子树来寻找不符合条件的节点。

2024-01-19 15:49:49 360

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

这道题感觉迭代法更容易理解,因为二叉搜索树是有序的,是可以自上而下进行遍历的,只要遇到在元素值在 p、q 之间([p, q])的节点就可以返回,因为这就是两个目标节点的最近公共祖先。递归写法,我们知道 BST 中一定会找到这两个节点,所以一定会返回非空节点。我们不需要对中间节点进行处理,所以使用哪种遍历方法都是可以的。

2024-01-18 23:12:02 316 1

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

二叉搜索树是有序的,中序遍历就可以得到有序数组,所以要获得有序数组的各种数学性质是很方便的。在中序遍历过程中就可以实现这一过程。迭代法。

2024-01-17 23:26:22 358

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

思路上这道题与昨天的从遍历数组构造二叉树那道题是一致的,也是进行一层一层的递归。。

2024-01-16 14:10:04 394 1

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

其实这道题用层序遍历思路上是最直接的,但用递归法也是可以的,我们需要注意的是必须优先遍历左节点,这样每一次进入更深层时首先遍历到的始终是最左侧节点。因此,前中后序的遍历都行,因为这里没有中间节点的处理,只要保证左在前。(层序遍历)

2024-01-15 11:38:48 331

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

注意这道题是用高度来判断,因此递归实现的后序遍历就是最直接的。但是要注意递归函数的参数和返回值,我们需要对已经不平衡的情况进行标记(-1这种不会出现的值),同时还需要返回树高。本题也可以用迭代法做,即在每一个节点处比较其左右子树的高度差,但这种做法重复运算太多。。。就不在这里实现了。

2024-01-14 14:27:37 345 1

空空如也

空空如也

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

TA关注的人

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