力扣刷题
文章平均质量分 53
对力扣进行刷题,坚持两个月
liuhuisi23
冲
展开
-
力扣刷题||L491.递增子序列、L46.全排列、L47.全排列 II
在这在每层开始的前提,设立一个set容器,在每层搜索一个数的时候,判断此数是否在每层中出现过,若出现过,则跳过,避免重复,并且因为是要递增,故每个数必须大于path的最后一个数,这样才能满足条件,但是第一个数不满足此条件,故需要判断path是否为空。在回溯对每层的每个数判断时,应该判断该数是否在之前进行树形的时候使用过,在这采用一个全局set数组,对每层每个使用过的数,将其插入,然后再每层开始之前,判断当前数是否在set中出现过,若出现过说明不能使用,则会导致后面重复。原创 2023-05-27 22:44:37 · 48 阅读 · 0 评论 -
力扣刷题||343. 整数拆分、96.不同的二叉搜索树
而i得从3开始,并且在这里,其实j完全没必要预测到最后,因为预测到最后,其实只是把结果重新又来了一遍,完全可以取i/2;并且还有dp[i-j]*j,这里的意思就是先将i分为i-j和j,然后依次往上叠加,依次求其最大值,看是怎样将分为一个多大j和多大的d[i-j]之和能达到最大。所以当根节点为j时,那么左子树就有j-1个结点,右子树又i-j个结点,然后分别让其相乘,就能得到当前j为节点时,有多少种二叉搜索树。2、确定递推关系,dp[i]的值,可能是直接将其差分为i-j和i,两个直接相乘。原创 2023-06-07 16:10:35 · 41 阅读 · 0 评论 -
贪心算法||力扣刷题,L122.买卖股票的最佳时机II 、L55. 跳跃游戏、L45.跳跃游戏II
若在当前范围内,nextCover值大于数组长度,说明能够达到,我们直接跳出循环即可,若不能,就让当前范围,等于此范围内的最大范围值,更新此范围,向后走。卡哥思路是,判断第二天减去第一天价格是否大于0,若大于0 说明是盈利的,只要盈利就加上,依次向后走,直到遍历完整个数组,最后的盈利也就是最大盈利。因为当前可用范围就是我们能够在当前达到的最大范围,若已经到达最大范围还是没能够到达最后一个值,说明我们要往后面走一步,看看新的范围,不断在此范围内,遍历,下标,选取能够到达的最大跳跃位置,判断是否满足条件即可。原创 2023-05-29 22:01:58 · 51 阅读 · 0 评论 -
贪心算法|| 860.柠檬水找零 、406.根据身高重建队列 、452. 用最少数量的箭引爆气球
本题的思路,考虑到重叠区间,先按照每个区间的左区间进行排序,然后从第一个区间开始来求交集,如果第二个鱼第一个有交集,说明我们能够一剑刺穿,这里如何判断是否有交集,那就是你的左区间在我的右区间之内或相等。若为20的,则需要判断是否有10块的和5块的,若同时有,则可以、若没有十块的,但是有3张或以上的5块,则也可以,从头遍历数组,若直接收到不是5元的,说明不可能找现,直接返回false。说实话,这道题的思路,属实想不到,本题的思路建议看代码随想录。若为10元,判断当前是否有5元,若有,则可以。原创 2023-06-01 11:21:55 · 61 阅读 · 0 评论 -
力扣刷题||动态规划 62.不同路径 、63. 不同路径 II
本题是求路径有多少,而不是求方法,到达某一格子只能通过从上或者从左边达到,并且动态规划的结果往往取决于上一步,所以可以有。本题相对于前提来说,需要考虑是否存在障碍物,若存在,说明到达此格子没有路线,我们只需要要保持其状态即可。注意初始化,因为在第一行和第一列,到达每个格子都只有一条路线,所以总体代码可如下。并且考虑一些细节问题,如第一个格子和最后一个格子有障碍物。初始化时,如果当前格子有障碍物,那么就不管,使其为0。5、打印dp数组||举例推导dp数组 方便debug。3、dp数组应该如何初始化。原创 2023-06-05 16:39:13 · 425 阅读 · 0 评论 -
贪心算法||1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
其实大家仔细看题目就发现因为题目答案是唯一的,如果是从当前站点开始,说明在当前站点之前都不行,也就是小于0,但是存在一个唯一值,是不是从当前站点开始后面的都要大于0,这样两者相加才能大于或等于0,那么此站点是唯一的。后对卡哥代码研究,发现好的算法,确实能使代码精简,卡哥直接按照绝对值最大进行排序,然后依次遍历,判断是否有负数,若有就将变为正数,并且k--,遍历完毕,看k是否为奇数,若为奇数,那就对最后一个值翻转,若不为奇数,则直接累加。如果取最小值,说明我只能满足其中一种,但是另一种无法满足条件。原创 2023-06-01 10:54:55 · 63 阅读 · 0 评论 -
力扣刷题||打家劫舍系列问题
在递推公式这,因为一开始,我就保证了,我要么偷当前房间,要么不偷,后面也是,也就是对前面的数值进行一个规划,就是一开始我就按照这个逻辑来的,并且取值也是按照正常逻辑走的。当一个小偷进入房间,要么就是偷,要么就是不偷,所以,在这定义dp数组为,小偷进入该房间我选择偷还是不偷能得到的最大钱数。思路:因为这里存在环的问题,根据题目,可以知道要么不取首元素,要么不取尾元素,这样才能够避免环尾和环头进行相邻。本题相对而言,还是有难度的,对后序遍历,一刷过程,先这样,等待二刷。5、打印dp数组,进行一个验证。原创 2023-06-12 11:24:33 · 70 阅读 · 0 评论 -
力扣刷题||39. 组合总和、40.组合总和II、131.分割回文串
2、在这里我们应该知道如何去重,对candidates拍完序之后,倘若遇到前后两数都相同,并且需要判断标签位数组的[i-1]是否为false,如果为false,那么我们将直接跳过此数,因为在之前,我们就基于此数进行了组合,一开始认为本题跟39差不多,自己先对数组进行了排序,然后再去除重复元素,但发现会删除掉一些符合条件的元素,才发现出问题了,也就是不知道如何动态的去重。其次这是对一个字符串,从左到右,分别取一个,再取两个,依次叠加,直到全部取完。本题难点,如何切割,一步一步切割问题是一个难点,原创 2023-05-23 22:20:37 · 104 阅读 · 0 评论 -
回溯算法理论基础+77. 组合
本题是求组合问题,也就是先取一个数与接下来的数进行组合,然后再取一个数,再与其他进行组合,以此往复,直到满足终止条件才会终止。回溯一般是纯暴力搜索解决的问题(组合问题、切割问题、子集问题、排列问题、棋盘问题)思路:关键语句,回溯法可以抽象为一个树形结构,再运用递归的方式来进行求解。回溯法可以抽象为一个树形结构,跟递归使用来理解。回溯与递归相辅相成,回溯一般在递归后面。1、回溯函数模版返回值以及参数。3、回溯搜索的遍历过程。2、回溯函数终止条件。原创 2023-05-23 11:25:52 · 57 阅读 · 0 评论 -
力扣刷题||216.组合总和III、17.电话号码的字母组合
本题自己一直没把终止条件写好,导致一直在错误,因为一开始就需要判断加入的下标值是否等于digits的大小,如果等于,说明我需要进行一个加入了,若不满足则不用管,我一开始是判断若加入的值比他大,那么就直接返回,这样在后续的一个加入过程中,会将已经排好的结果数组,最终将其弹出为空。思路便是,将其抽象为一层一层的树形结构,每层的树形结构便是对每一个数字对应的值进行一个遍历,依次遍历,一个一个往下遍历,这样最终结果也就出来了。sum值等于n,且当前数组的数组大小也等于k,说明符合条件。原创 2023-05-23 17:46:48 · 59 阅读 · 0 评论 -
二叉树||235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点
学习过236题之后,发现很多算法基础,搜索二叉树的性质,通过判断根节点大小来进行左右子树的区别,但是想不到若不能往左右子树往下面进行搜索,那么此根节点就是祖先。对于二叉树的一个个递归的返回属实有点捉摸不透。本来自己想了一种方法,放到了代码里面的备注中,但是发现只是局部变量,并不是全局变量的改变。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。701.二叉搜索树中的插入操作。这题有点难度,还在理解中。原创 2023-05-21 23:05:12 · 113 阅读 · 1 评论 -
学习+力扣刷题||L239滑动窗口最大值
3、删除,判断当前值是否等于队头的元素(在这里,当前值是指k窗口向后滑动的时候,原数组多出来的那个值,若相等,则说明要排出该元素,若不等,说明在一开始我本值就不是最大的那个值,已经被排除)2、先将K个值插入队列中(插的过程中,判断队列最后一个元素是否比要插的值下,若小,就将其排出),这样做的目的,是保证在当前K个值内,可以找到当前最大的值,也就是对队列进行一个单调递减。2、开始遍历nums,一个一个取,一个一个退出,然后每加一个元素就寻找一下最大值,将其插入一个数组,将其返回。你只可以看到在滑动窗口内的。原创 2023-05-05 18:29:10 · 449 阅读 · 0 评论 -
刷题||454.四数相加II 、383. 赎金信 、15. 三数之和 、● 18. 四数之和
本题感觉可以采用四层for循环来进行操作,但是可能会会变得复杂化,本题中采用两次for循环,先将前两个数组各元素之和放入一个map中,统计其出现的次数,再到后面统计(0-(i+j))是否能在map中找到,若能找到,将当前result的value值加起来就好了,因为每一个value值都表示每一个下标都不一样,至于什么时候使用什么类型的哈希表,得视情况而定,并且map中的key值可以对其进行排序,但是key值不能重复,一般会自动进行排序,若不行,就自己进行写操作符重载,来进行map的一个排序。原创 2023-05-01 22:52:06 · 816 阅读 · 0 评论 -
力扣刷题||二叉树 L104.二叉树的最大深度 、L559.n叉树的最大深度、L111.二叉树的最小深度、L222.完全二叉树的节点个数
理解深度与高度的概念,深度从根节点到底层叶子结点,而高度则相反,采用后序遍历,可以遍历其深度,也就是从底层一层一层往上遍历,并且每个节点的位置,是叶子结点深度+1,这样就能最后返回最大深度,并且是判断每个节点左子树与右子树的最大值,并且可以采用层次遍历也一样,遍历到第几层则,就+1。其中要考虑,左子树可能为空,但是右子树不为空,则最小深度并不是1,则需要分别进行讨论,也就是左子树有空,右子树不为空,那深度就是右子树+1,左子树也一样,这样依次寻找最小的值,递归遍历,采用后序遍历的方式,重点理解递归。原创 2023-05-16 19:31:40 · 94 阅读 · 0 评论 -
栈与队列||L232用栈实现队列、L225用队列实现栈
队列:两头都可进出,一般是先进先出,若封住一头,就可以做栈使用。知道如何用栈实现队列,那用队列来实现栈也就不难了。原创 2023-05-04 19:53:53 · 505 阅读 · 0 评论 -
力扣刷题||L110.平衡二叉树 、L257. 二叉树的所有路径 、L404.左叶子之和
若不为空,path就加一个"->”,并开始新一轮递归,直到找到叶子节点,找到之后,因为在这并没有采用引用的方式进行引用标量,故传入的path值时一个局部变量,并不会改变上一级的值,虽然在本轮函数中已经加了一个value值,但在上一轮中末端还是“->”。本题的思路,看卡哥的是用到了回溯,因为是从第一个根节点,来返回所有的路径,所以在这使用前序遍历,当遍历到最后一个叶子节点时,条件判断为左右孩子节点都为空,这样就将其加入其中。本题返回所有路径之和,自己一开始未搞清二叉树的前中后三种遍历方式,导致一直犯迷糊。原创 2023-05-17 21:49:13 · 52 阅读 · 0 评论 -
力扣刷题||二叉树
父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。完全二叉树:除了最底层节点没填满之外,其余每层节点数都达到最大值,并且是从左往右达到排满。满二叉树:每个节点度为0或2,且度为0的位于同一层。具有2k-1个节点的二叉树。平衡二叉搜索树:AVL,左右孩子高度差不超过1,两个子树都是一颗平衡二叉树。二叉树存储方式:链式存储、顺序存储。深度优先遍历(前序,中序,后序)遍历:前中后序遍历,层序遍历,二叉树:满二叉树和完全二叉树。二叉搜索树,是一个有序树。原创 2023-05-10 20:31:38 · 168 阅读 · 0 评论 -
哈希表||L242.有效的字母异位词、L349. 两个数组的交集、L202. 快乐数、L1. 两数之和
set包括unordered_set,也优先使用,因为其查询和增删效率是最优的 要求有序就用set,也就是关键词不重复,若有重复就用multimap。当需要我们进行判断,是否有一个值出现过,或者查找某个值的属性就可以使用哈希表。本题可以 采用暴力解法,但是算法嘛,学习嘛,还是得用算法来解决。map就是value不能一样,但是其值可以一样。主要有三种:数组、set、map。具有关键词、和关键词所对应的值。原创 2023-04-29 19:58:38 · 712 阅读 · 0 评论 -
力扣刷题||669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树
2、当遇到节点有大于或小于,超出限制范围,根据二叉搜索树的性质,思考其左右子树是否也不符合,或者符合,采用递归方式,并将其新的根节点存储下来,返回其新节点。4、采用平分的方式对数组进行平分,并采用左闭有闭区间的方式,然后再将本根节点返回。2、每回将数组中间节点作为根节点,然后分开左右数组,并分别用其构造左右子树。一定理解二叉树前中后序的遍历,一般是根据二叉树的中间节点来坐文章。3、将当前根节点的左子树的指向,指向要新返回也就是递归的节点。什么是完全二叉树,什么是满二叉树,二叉搜索树,平衡二叉树。原创 2023-05-22 17:31:43 · 79 阅读 · 0 评论 -
力扣刷题||● 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先
本题要求树中任意两不同节点值之间的最小值,根据二叉搜索树的基本性质,由中序遍历左中右,左节点<中节点<右节点,一直往上推,这样,采用双指针方法,与一个数值方法,不断更新此数值的大小,若新的值比此数值小就更新,若不小则不更新,采用中序的遍历方法。在这里不看卡哥的视频,一直不知道如何更新vector的值,只会一步一步按照双指针判断是否相等,相等就用+1,这样来进行一个相加,看完卡哥视频,自己再写一遍加深影响。这道题有难度,看了几遍卡哥视频,才勉强看懂一点点,因为涉及了回溯,且涉及回溯就必须要用后序遍历。原创 2023-05-21 18:13:52 · 72 阅读 · 0 评论 -
刷题||L344.反转字符串、L541. 反转字符串II、L剑指Offer 05.替换空格、L151.翻转字符串里的单词、L剑指Offer58-II.左旋转字符串
这一次刷题,让我学会了剪枝,和相关条件判断,还有对字符串全部翻转,和短翻转的过程,双指针在字符串中的应用。原创 2023-05-02 16:07:37 · 659 阅读 · 0 评论 -
栈与队列||L20. 有效的括号、L1047. 删除字符串中的所有相邻重复项、L150. 逆波兰表达式求值
再看过卡哥代码讲解之后,才发现好的算法能让自己的代码变的漂亮起来,也就是对算法精度的理解,只要遇到左边括号,就插入一个右括号,若遇到一个右括号,判断其是否等于栈顶的右括号,若相等,就将其弹出,若不等则报错,以此反复。一开始自己思考了一种方法,其在力扣上也能跑通的,但代码长度有点长。本题也一样,只要理解题目要求就好,遇到符号就取两个元素进行运算。知道今天安排的第一题如何写,后面的也就游刃有余,依葫芦画瓢。三题训练,加深对栈与队列的影响。原创 2023-05-04 21:34:57 · 502 阅读 · 0 评论 -
力扣刷题|L24. 两两交换链表中的节点 、L19.删除链表的倒数第N个节点 、L面试题 02.07. 链表相交 、L142.环形链表II
首先自己想了一下,可以判断出是否有环,但是无法找到起点,果然一切的理论都得建立在数学基础上,然后在卡哥的这一段代码处,思考了一会,发现跳转两个节点,那就得判断当前节点和下一节点都不为空,这样才能保证后面进行跳转的时候不会出错,就算fast->next->next为空,也没关系,这样才会跳出循环,之所以这样写,也算是避免有单个节点的链表。总结:通过对卡哥链表的学习,确实学到很多东西,在录友群里交流也学会很多,果然一个学习效率永远低于一群人的学习效率,希望二刷的时候,能学到更多的知识点。原创 2023-04-23 22:49:18 · 1410 阅读 · 1 评论 -
力扣刷题:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
总结:看题解,mid和loop的求解,不看题解,根本不知道这样去写,也就是不知道如何进入循环,自己知道从上到下,一个一个遍历来进行插值。总结:本题可以采用暴力解法也可以采用滑动窗口法,收获就是如何确定窗口的起始位置与终止位置。还有n%2这里,来判断是否是奇数列,中心位置还要单独考虑。原创 2023-04-20 21:39:49 · 1858 阅读 · 1 评论 -
链表学习|L203.移除链表元素、L707.设计链表、L206.反转链表
本题一开始让我有点懵逼,也是采用的双指针对其进行翻转,但始终没有把逻辑理清楚,也就是一个快指针,一个慢指针,将快指针所指向的链表用一个中间变量存储起来,然后改变将快指针的指针指向慢指针,慢指针在等于快指针,相当于是一个交换标量,最好还是结合图一起来。单链表:通过指针串联在一起的线性结构,由两部分组成,一部分数据域,一部分指针域,通过结构体来对其进行创建,其包含一个数值,一个指针(指向下一个链表),还有一个构造函数。存储结构:链表的内存是不连续的,而是散乱分布,每次定义链表的时候都需要new一块内存。原创 2023-04-22 14:36:52 · 1574 阅读 · 1 评论