自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【leetcode100-086到090】【动态规划】一维五题合集2

当我们拿到一个新的字符i,有两种情况,左括号结尾的必无效,填0直接continue,右括号结尾时,我们要做的是:看看这个右括号能不能找到对应的左括号,把以字符i-1结尾的有效串包在里面,如果找到了,那么这个有效串的长度就增加了2,还没完,我们找到了最左边的括号以后,还要看看它的前一个字符能提供多长的有效串,拼接起来,此时才真正拿到了以字符i结尾的最长的有效串;对第i个元素,我们检查它前面的所有元素,并试着把它接在该元素结尾的子序列后面,如果还能满足递增,则记录接上后的子序列长度;

2024-02-05 17:55:14 944

原创 【leetcode100-081到085】【动态规划】一维五题合集1

对当前数字,能从中减掉的完全平方数可能不止一个,因此,我们应该把能减的平方数全都试一遍,并把所有答案中最小的那个设为当前数字的dp值。因此,我们可以先从当前数字中减掉一个完全平方数,然后通过dp直接拿到剩下的数的dp值,此时,这种切分方式得到的答案就是该dp值+1;你是一个专业的小偷,计划偷窃沿街的房屋。//爬i级=先爬i-1级再爬1级+先爬i-2级再爬2级,没有其他可能了。偷它,那么i-1号房子不可以偷,总金额是,偷i-2及以前的房子+偷i;不偷它,那么i-1房子可以偷,总金额就是偷i-1及以前的房子;

2024-01-31 21:29:54 761

原创 【leetcode100-077到080】【贪心】四题合集

如果把这个最后位置转换成跳跃距离,诶,有没有发现这题就变成了跳跃距离1,只不过跳跃距离那道题想要的是走得越远越好,而我们想要的是走得越近越好(子串越短越有可能切出更多的片段)因此,我们要干的其实就是边扫描边更新当前的“最远距离”,直到没法再往前跳,就是该切的时候了(记录当前子串的长度),然后我们再对切剩下的部分重新开启新的一轮扫描,直到整个串被切完。我们维护一个变量limit,记录当前扫过的元素可以让我们跳跃的终点,初始值为0,也就是最开始只能跳到第一个元素。返回一个表示每个字符串片段的长度的列表。

2024-01-29 19:10:18 624

原创 【leetcode100-074/075/076】【堆】三题合集

注意,这时候我们的第三条规则“左右两半的元素个数要么相同,要么左边比右边多一个”是有可能被破坏的,所以针对这个被破坏的情况我们还需要从造成规则破坏的那一边拿一个元素到另一边去,以恢复两边元素数量关系的合法性。第一个数一定是左半边所有数里最大的,而如果有第二个数,它一定是右半部分最小的,以及左右两半的元素个数要么相同,要么左边比右边多一个。初始状态我们的数组是空的,随着新数字的到来,我们依次将其按照规则添加到数组中,并实时地计算出添加后左右半边的最大值和最小值,就可以顺利地随时获取中位数啦。

2024-01-28 23:14:17 745

原创 【leetcode100-069到073】【栈】五题合集

第二题的逻辑和第一题相同,只是评判条件和第一题相反,因为要找的是第一个小于当前元素的,找到它就找到了当前矩形的右边界,而栈内元素是递增的,左边界就是栈顶元素下面的元素(其实不一定,可能会有非严格递增的情况,也就是栈顶和它下面的元素一样大,但因为本题找的是最大值,这样做对结果不会有影响,所以就不单独拿出来讨论了)。对第一题来说,要找的是比自身大的,因此在遍历时,遇到小的先存起来,只有当前元素比栈顶下标元素大时,才开始弹出栈内下标,直到栈内没有比当前元素更大的数时停止,并把当前元素入栈。,判断字符串是否有效。

2024-01-27 22:44:58 1015

原创 【leetcode100-063到068】【二分】六题合集

所以,最好的情况是,比n1小的数有k-2个,此时n1的位次是k-1,这就意味着,n1不可能是我们想找的第k大的数,当然,数组1中n1前面的数只会更小,就更不可能是我们要找的数了,于是我们把数组1中n1及以前的元素全部丢弃,起始位置来到n1的下一个元素。中位数,本质上是找下标为size/2的数,或者说第size/2+1大的数(偶数的话下标为size/2和下标为size/2+1取平均),所以本题要完成的任务,其实就是给定一个k,在两个数组中找到整体第k大的数。显然,初始的上下界是数组本身的起始和结尾。

2024-01-26 20:16:53 936

原创 【leetcode100-055到062】【回溯】八题集合

比常规框架多了一个数字到字母集合的映射罢了,我们用一张哈希表来解决这个步骤,然后就是对当前数字的可选字母进行遍历,对每个字母进行选择-递归-撤销选择流程。对任意元素,我们遍历以它为起点的所有可能子串,当某子串是回文串时,我们切一刀,并对切剩下的部分开启递归,结束后恢复原状并去判断下一个可能的子串。回溯专题,通用的框架在于选择-递归-撤销选择的过程,在每一个题中都有体现,就不一一重复了,只讲一讲每个题特殊的地方。光回溯太无聊了,加了一点剪枝,或者说其实只是把本来放在函数里面的判断条件放到了开启递归之前。

2024-01-24 23:52:21 1402 1

原创 【leetcode100-051到054】【图论】四题合集

代码其实跟树的dfs也大同小异,区别只在出口的判断条件,以及可能递归的方向从两颗子树变成了四个方向(网格的情况,普通图的话就是变成所有neighbors)。对每个格子,我们向上下左右四个方向拓展,对其中位置合法的、是陆地的、还没被访问过的格子进行递归调用,直到所有能访问的格子都访问完毕。每次开启函数(而不是被递归调用),会将当前起点能接触到的所有陆地都访问一次再退出,记录函数开启的次数即可。从这题开始离开了美好的网格,变成了普通的图,好在这是一个超经典拓扑序列题,我们捋一下拓扑序列的思路就好了。

2024-01-22 23:52:38 1344

原创 【leetcode100-044到050】【二叉树】七题合集

其实这个构造二叉树的过程用自然语言描述非常简单,我们最后做的不过是用代码翻译了这个过程:用前序找到当前的根节点,在中序找到根节点的位置,此时我们知道了左右子树各自的节点数量,which means我们知道了前序和中序序列中哪一段属于左子树,哪一段属于右子树,此时已经可以递归,算好参数传一下就搞定啦。最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(这题也写了双解,从两个解都获得了一点思路的突破,可开心了。

2024-01-21 22:20:42 1030

原创 【leetcode100-042/043】【二叉树】二叉搜索树的转换和验证

虽说是整个子树的上下界,但我们只要检查左右孩子就可以,因为递归函数会帮助我们检查到所有的节点,而越小的子树其上下界范围只会越严格,所以不可能出现某节点在小子树时合法而在更大的子树中非法的情况。显然,对某个节点的左子树来说,其下界和以该节点为根节点的整个二叉树是相同的,而其上界则是该节点自身的值,右子树同理,只是改变的是下界。一开始写了个经典错误版,也就是在判断环节只验证了左右孩子和父节点的关系是否合法,但我们要的其实是左子树所有节点都必须合法。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。

2024-01-19 23:05:04 627

原创 【leetcode100-038/039/040/041】【二叉树】翻转/对称/直径/层序遍历

具体操作方面呢,对一个节点来说,我们计算以它为最高节点的最长路径长度(它作为过程节点的路径,会在更高层次被计算,这样限定可以保证不做重复计算,而且,不这样限定也没法算了。),显然,我们分别往左右子树走出最长的路径,然后加起来,就可以得到答案。本题有个比较关键的地方,就是路径不一定过根节点,这就意味着要对每个节点都做直径计算,而且不一定层次更高的节点它的结果就会优于层次低的节点,所以答案并不是从下往上传递的,我们需要弄一个全局变量来记录它,保证随便在哪一层递归里面都可以顺利地访问它。, 检查它是否轴对称。

2024-01-18 17:37:20 879

原创 【leetcode100-037】【二叉树/dfs/bfs】二叉树的最大深度

是指从根节点到最远叶子节点的最长路径上的节点数。还是二叉树经典题,今天写两个解法。

2024-01-17 17:45:34 638

原创 【leetcode100-036】【链表】二叉树中序遍历(四解)

怎么说呢,链表遍历毕竟还是太经典了,所以只是记录了一下关键思路,让我们来看代码吧。由于题很简单,今天试试写多解,不然实在是太偷懒了。给定一个二叉树的根节点。

2024-01-16 22:08:25 847

原创 【算法笔记】分支限界专题

if(cur.cv + items[n_i].volume <= V){ //装不下则剪掉选择该物品的分支。if(cur.cv + items[n_i].volume <= V){ // 左剪枝。

2024-01-15 22:38:49 1173

原创 【leetcode100-035】【链表/哈希链表】LRU缓存

请你设计并实现一个满足。的平均时间复杂度运行。

2024-01-14 23:31:07 788

原创 【算法笔记】回溯专题

基本遵循了选择-改状态-step+1-恢复状态的回溯标准步骤,在标准步骤执行完以后增加了不选当前节点的情况并判断是否剪枝,且因为不选,没改变状态,所以该分支只有进一步搜索,没有状态改变和恢复的过程。//返回当第t个商品不装时,返回前t个商品(不包括第t个)的总价值+剩余的全部商品价值。我觉得,回溯的算法语言很像是在做一个对人在现实中做决策情况的模拟,对于不确定对不对的决策,先试试,不行再撤销。if(curv + v_i[step] <= v){ //判断放入第step个物品不超重,尝试放入。

2024-01-13 15:27:34 602

原创 【算法笔记】贪心专题

i<n;

2024-01-12 19:48:04 904

原创 【算法笔记】分治专题

在此类型的题目中,找到正确的分割点才是目的,对分割出的子问题们进行处理一般只是为了将其中的元素正确地归类,从而通过找到类型转换的临界点来确定分割点的位置,在此类问题中,分割动作的目的在于缩小可能的解的范围,直到范围中只剩一个解时,那就是正解。其次,假设某单元素的左区间和某单元素的右区间形成了一个逆序对,当该层递归走到出口时,这两个区间将会被合并,此时该逆序对成为了区间内部的逆序对,并且在更靠外的任何一层递归内,都是区间内部的逆序对。

2024-01-10 11:50:54 1068

原创 【算法笔记】动态规划专题

所有解题思路已经直接整合在代码注释中。

2024-01-09 21:15:39 1516

原创 【leetcode100-034】【链表/优先队列】合并k个升序链表

请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。

2024-01-08 22:31:14 602

原创 【leetcode100-033】【链表】排序链表

【代码】【leetcode100-33】【链表】排序链表。

2024-01-07 21:16:50 685

原创 【leetcode100-032】【链表/回溯/哈希】随机链表的复制

指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。例如,如果原链表中有。返回复制链表的头节点。

2024-01-06 22:26:26 590

原创 【leetcode100-031】【链表】k个一组翻转链表

是一个正整数,它的值小于或等于链表的长度。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。的整数倍,那么请将最后剩余的节点保持原有顺序。个节点一组进行翻转,请你返回修改后的链表。

2024-01-05 17:59:48 623

原创 【leetcode100-30】【链表】两两交换链表节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

2024-01-04 17:53:24 910

原创 【leetcode100-029】【链表/双指针】删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

2024-01-03 15:38:32 624

原创 【leetcode100-028】【链表】两数相加

然后对较短的那条链进行一个补零,具体呢就是判断一下它走完没有,要是哪条走完了另一条还没走完,就用0顶上去做加法。进了的话还得添个新节点放这个多余的1,好离谱啊怎么会有1多余呢(?让我们来整一个进位位,作用跟小学加减法那个“有进位点个点”一样儿一样儿的。真受不了,谁那么无聊用链表做加法啊买个集成了加法器的cpu行不行。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。

2024-01-02 14:43:57 728

原创 【leetcode100-027】【链表】合并有序链表

归并的链表版罢了,每次选取两个头部中较小的加入新链,直到某一条旧链用完,把剩余的那条(如有)接上,搞定。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。

2024-01-01 22:12:10 605

原创 【leetcode100-026】【链表/快慢指针】环形链表II

指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。如果链表中有某个节点,可以通过连续跟踪。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。给定一个链表的头节点。如果链表无环,则返回。,则在该链表中没有环。

2023-12-31 18:28:26 692

原创 【leetcode100-025】【链表/快慢指针】环形链表

当表中有环时,两个指针最后必定都在环内循环前进,且速度不同,那么也必然在环内相遇并退出函数。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。当然如果你只是想在力扣通过这题的话......让我们拿出计步器∠( ᐛ 」∠)_来表示链表尾连接到链表中的位置(索引从 0 开始)。而表中无环时,快指针必然会走到链尾并退出函数。如果链表中有某个节点,可以通过连续跟踪。从函数退出的方式就可以知道表中是否有环。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。

2023-12-30 17:59:28 626

原创 【leetcode100-024】【链表/快慢指针】回文链表

补充一个递归方式逆向输出单链表的方法,虽然本题用不上。,请你判断该链表是否为回文链表。给你一个单链表的头节点。空间复杂度解决此题?

2023-12-29 17:14:16 726

原创 【leetcode100-023】【链表】反转链表

太经典了,感觉也没什么必要用文字来描述了,今天实在太累了,直接代码吧。,请你反转链表,并返回反转后的链表。

2023-12-28 18:57:33 655

原创 【leetcode100-022】【链表/双指针】相交链表

请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。琢磨了很久终于想起来了,是那个很浪漫的链表相交。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。

2023-12-27 17:40:13 725

原创 【leetcode100-021】【矩阵】搜索二维矩阵 II

以右上角为起点斜着看这个矩阵,会发现,这是一颗二叉搜索树。那么我们就从右上角(0,n−1)处开始搜索。编写一个高效的算法来搜索。

2023-12-26 17:05:51 952

原创 【leetcode100-020】【矩阵】旋转图像

旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。使用另一个矩阵来旋转图像。

2023-12-25 13:18:45 792

原创 【leetcode100-019】【矩阵】螺旋矩阵

返回矩阵中的所有元素。

2023-12-24 15:31:34 773 1

原创 【leetcode100-018】【矩阵】矩阵置零

则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。

2023-12-23 16:35:11 1147 2

原创 【leetcode100-017】【原地hash】缺失的第一个正数

请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。给你一个未排序的整数数组。请你实现时间复杂度为。

2023-12-22 11:21:47 625

原创 【leetcode100-016】【数组】除自身以外数组的乘积

的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组。之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。

2023-12-21 09:51:14 885 1

原创 【leetcode100-015】【数组】轮转数组

经典老题,就不从数学角度证明了,三次翻转解决问题。,将数组中的元素向右轮转。

2023-12-20 08:58:10 616 1

原创 【leetcode100-014】【数组】合并区间

一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2023-12-19 14:38:06 672 1

空空如也

空空如也

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

TA关注的人

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