自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第三十四天|62.不同路径、63. 不同路径 II 、复习第一天

今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下详细布置62.不同路径本题大家掌握动态规划的方法就可以。数论方法 有点非主流,很难想到。

2023-08-06 09:48:30 98

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

看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);4、确定遍历顺序:因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。

2023-08-04 11:49:36 76

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

738.单调递增的数字想到暴力法,显然超时。

2023-08-03 20:07:23 72

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

遍历字符串,得到每个字符第一次出现后最后一次出现的位置,构成一个区间,如果区间相交,则合并成一个大区间如果不相交则求区间长度,加入结果中(统计字符串中所有字符的起始和结束位置,记录这些区间(实际上也就是。非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

2023-08-02 13:25:19 83

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

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。按照身高h来排序,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。局部最优:当气球出现重叠,一起射,所用弓箭最少。本题是一道 重叠区间的题目,好好做一做,因为明天三道题目,都是 重叠区间。本题有点难度,和分发糖果类似,不要两头兼顾,处理好一边再处理另一边。遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。

2023-08-01 13:33:20 24

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

1005.K次取反后最大化的数组和本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。我的问题:先将数组排列了,而非根据绝对值排序134. 加油站本题有点难度,不太好想,推荐大家熟悉一下方法二我想到了暴力法。

2023-07-31 19:23:57 27

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

那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。最后的步数就是最少步数。不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

2023-07-29 17:54:31 54

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

贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。不用花心思去研究其规律, 没有思路就立刻看题解。基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。学完贪心之后再去看动态规划,就会了解贪心和动规的区别。理论基础如何验证可不可以用贪心算法呢?。。

2023-07-28 20:45:22 29

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

今天这三道题都非常难,那么这么难的题,为啥一天做三道?因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。大家今天的任务,其实是 对回溯算法章节做一个总结就行。332.重新安排行程(可跳过)太难,做不出给定一系列机票信息(起始机场和目标机场),每个机票只能使用一次。要求找到一个行程单,使得可以遍历所有机票并按照字母顺序返回。

2023-07-27 20:04:43 57

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

本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。

2023-07-26 16:41:33 31

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

93.复原IP地址本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了。

2023-07-25 13:26:45 63

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

39. 组合总和本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制没有理清楚startIndex的控制:直接去除startIndex会导致相同组合被重复记录,保留startIndex会导致“数字可以本题和我们之前讲过的因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!而在和中都可以知道要递归K层,因为要取k个元素的组合。

2023-07-24 22:32:14 33

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

index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。,无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。for循环的范围也可以剪枝,i <= 9 - (k - path.size()) + 1就可以了。i至多只能到9-(k-path.size()),才能满足后面的元素,足够填补上空缺的元素。当前递归中,组合中目前已经有path.size()个元素,题目要求有k个,叶子节点就是要收集的结果集。

2023-07-22 12:40:54 33

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

理论基础其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。。如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。因为回溯法解决的都是在集合中递归查找子集,。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

2023-07-21 01:12:01 37

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

因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。同时需要定义一个全局变量pre,用来保存cur节点的前一个节点的数值,定义为int型就可以了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。

2023-07-20 18:47:29 24

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

235. 二叉搜索树的最近公共祖先相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先。

2023-07-19 14:21:41 31

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

530.二叉搜索树的最小绝对差需要领悟一下二叉树遍历上双指针操作,优先掌握递归题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。,二叉搜索树可是有序的。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。那么二叉搜索树采用中序遍历,其实就是一个有序数组。最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。以上代码是把二叉搜索树转化为有序数组了,其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。

2023-07-18 18:40:36 36 1

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

654.最大二叉树又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历视频讲解:构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。617.合并二叉树这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。优先掌握递归。如何同时遍历两个二叉树呢?其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。

2023-07-17 20:49:35 38 1

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

513.找树左下角的值本题递归偏难,反而迭代简单属于模板题, 两种方法掌握一下本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。

2023-07-16 18:53:34 49 1

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

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。因为求深度可以从上到下去查 所以需要前序遍历(中左右,一直向下遍历,不向上返回结果),而高度只能从下到上去查,所以只能后序遍历(左右中,层层向上返回,每个父节点再加上自己高度+1)这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。

2023-07-15 13:36:54 36 1

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

104.二叉树的最大深度 (优先掌握递归)什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。大家 要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。题目链接/文章讲解/视频讲解:求高度是后序遍历,求深度是前序遍历;根节点的高度就是最大深度,所以可以用后序遍历本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。前序复杂很多,涉及到回溯。,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。

2023-07-14 19:31:42 40 1

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

层序遍历看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,

2023-07-13 21:26:39 78 1

原创 代码随想录算法训练营第十二天|理论基础、递归遍历、迭代遍历、统一迭代

二叉树的定义和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。int val;递归遍历 (必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单代码随想录递归三步:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

2023-07-11 20:25:09 30 1

原创 代码随想录算法训练营第十一天|239. 滑动窗口最大值、347.前 K 个高频元素、总结

为什么不用快排呢, 使用快排要将map转换为vector的结构,然后对整个数组进行排序, 而这种场景下,我们其实只需要维护k个有序的序列就可以了,所以使用优先级队列是最优的。暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。为了使输出数组中元素按照频率从大到小排序,可以将堆输出,倒序存入result数组中。之前讲的都是栈的应用,这次该是队列的应用了。(一刷至少需要理解思路)

2023-07-10 21:34:26 29 1

原创 代码随想录算法训练营第十天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

使用栈作为辅助数据结构,帮助记录遍历字符串过程中,1.遍历过哪些元素、2.遍历的前一个元素是什么,同时,也用栈直接做消除操作。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。最后从栈中弹出剩余元素,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。遍历完,栈不为空,则不匹配。

2023-07-09 18:56:12 35 1

原创 代码随想录算法训练营第九天|理论基础、232.用栈实现队列、225. 用队列实现栈

把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。使用两个栈完成出栈操作,将入栈中的元素全部转移到出栈中,然后再完成出栈操作。大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解。其实这道题目就是用一个队列就够了。了解一下 栈与队列的内部实现机智。,文中是以C++为例讲解的。225. 用队列实现栈。

2023-07-09 12:15:49 33 1

原创 代码随想录算法训练营第八天|28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾

KMP算法解决的是字符串匹配的问题文本串中是否出现过模式串暴力法:两层for循环,一层遍历文本串(长度n),一层遍历模式串(长度m),一一匹配,不匹配就将模式串整体向后移一位,继续匹配...直到完全匹配或移动到文本串结尾,不存在。O(m*n)KMP算法:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。前缀表(prefix table):前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。前缀表的任务是当前位置匹配失败,找到

2023-07-06 20:46:20 54 1

原创 代码随想录算法训练营第七天|344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数。其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。建议:对于线性数据结构,填充或者删除,后序处理会高效的多。

2023-07-05 22:29:53 47

原创 代码随想录算法训练营第六天| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和、总结

建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。先遍历两个,后遍历两个,O(n^2+n^2)=O(n^2);先遍历一个,后遍历三个,O(n+n^3)=O(n^3)四数相加与四数之和(一个数组中找出四个元素相加)相比,不用去重(不同位置上的相同元素视为不同的)454.四数相加II。

2023-07-04 20:34:37 29

原创 代码随想录算法训练营第五天 | 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

哈希表理论基础建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。这句话很重要,大家在做哈希表题目都要思考这句话。但是哈希法也是,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。哈希函数,把数据直接映射为哈希表上的索引,然后就可以通过查询索引下标快速知道数据是否存在于哈希表。将发生冲突的元素都存储在链表中。

2023-07-03 20:11:05 102 1

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

(偶数的话,cur.next==null,奇数的话,cur.next.next==null)具体交换节点的时候应该如何交换?双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。这样遍历链表时,才知道遍历过程何时结束。使用虚拟头节点,无需对是否是头节点进行特殊判断,而可以采用统一的方式进行删除操作。操作节点,指针一定要指向要操作节点的上一个节点。

2023-07-01 21:48:20 20

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

指针需要指向当前要删除位置的上一个位置,所以cur = head而非head.next,要删的话,只能删cur.next,让cur直接指向它的下下个节点。数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。在链表中再加入一个头结点dummy head,它是虚拟的,这样删链表里所有元素时就能使用常规方法中的2。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。

2023-06-30 19:38:44 100

原创 代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。有序数组,要求时间复杂度为O(n)的,应该考虑双指针法,重点在于如何分配两个指针各自的任务;: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。学习后的思路:双指针,分别指向数组首尾,比较平方大小,将较大的值存入新数组(从后向前存)O(n): 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

2023-06-29 18:58:02 221

原创 代码随想录算法训练营第一天| 数组理论基础、LeetCode704. 二分查找、LeetCode27. 移除元素

代码随想录算法训练营第一天| 数组理论基础、LeetCode704. 二分查找、LeetCode27. 移除元素

2023-06-28 16:47:56 507 2

空空如也

空空如也

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

TA关注的人

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