
力扣刷题
文章平均质量分 94
记录力扣刷题过程中学到的知识
PleaseBrave
我怕我配不上我受的苦难
展开
-
【二叉树遍历 Java版】二叉树的前中后序遍历and层次遍历
所谓深度遍历,即一个节点下面有子树的话,先遍历左子树(如果有)再遍历右子树(如果有),子树遍历完了,加上这个节点(根据前中后序遍历实际情况考虑这个节点是什么时候访问),这棵树遍历完了,再往上走,回到其父节点……这里有个很有意思的点,前序遍历是中-左-右,前序遍历的过程中,如果交换左右子树的遍历顺序,变成中-右-左,然后再reverse反转一下,变成左-右-中,即为后序遍历了。遇到一个节点,先遍历其左子树,左子树遍历完了,再遍历这个节点,然后再遍历这个树的右子树,这就是中序遍历的顺序。原创 2024-12-28 19:24:51 · 814 阅读 · 0 评论 -
【回溯Ⅰ】子集问题
回溯是一种算法,通常用于解决搜索问题、游戏问题、布局问题等。在回溯算法中,系统尝试在所有可能的选择中逐步构建解决方案,当发现当前的选择并不是有效的解决方案时,便回溯到之前的步骤,尝试其他的选择。这种方法通过深度优先的方式搜索所有可能的情况,直到找到解决方案或者确定不存在解决方案为止。选择:做出一个选择,尝试向前推进。约束:检查当前选择是否满足问题的限制条件。目标:检查当前选择是否是期望的解决方案。回溯:如果选择不满足约束条件或者不能达到期望的解决方案,就回溯到之前的步骤,尝试其他的选择。原创 2024-08-24 14:29:55 · 880 阅读 · 0 评论 -
【回溯Ⅱ】组合问题
问题就出在这个题目的candidates是重复的,还是candidates = [1,2,2,2,5],target = 5这个例子,三个2,不选第一个2+选第二个2,选第一个2+不选第二个2,实际是一样的。上面一题,在遍历数组的递归过程中,选择一个数字后,由于这个数字可以重复使用,因此idx不变化。这个test case的结果中出现了三次[1,2,2]是因为candidates中有3个2,结果中的两个2,可以是(第一个2,第二个2)、(第一个2,第三个2)、(第二个2,第三个2)。,并以列表形式返回。原创 2024-08-24 14:28:16 · 930 阅读 · 0 评论 -
【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角
动态规划是一种通过将原问题分解为相对简单的子问题来解决复杂问题的方法。基本思想是递归地将一个复杂的问题划分为许多更简单的子问题,存储这些子问题的每个子问题的解,并最终将存储的答案用于解决原始问题。通过缓存子问题的解,动态规划有时可以避免指数级的浪费。它通常用于优化问题,其中需要找到最佳解决方案。动态规划算法通常用于解决具有重叠子问题和最优子结构性质的问题。重叠子问题:原问题可以被分解为相同的子问题。这意味着在解决原问题时,我们可能多次解决相同的子问题。原创 2024-07-14 20:13:27 · 936 阅读 · 0 评论 -
【动态规划Ⅶ】买卖股票的最佳时机
这个blog总结买股票系列题目,一些题目加了特定的限制条件以后,就需要改变一下策略啦!原创 2024-07-14 17:45:27 · 1113 阅读 · 0 评论 -
【动态规划Ⅱ】打家劫舍等一维动态规划
同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。原创 2024-07-14 17:44:34 · 1071 阅读 · 0 评论 -
【动态规划Ⅲ】二维数组的动态规划——start到finish的不同路径
dp[i][j] 与p[i+1][j]和dp[i][j+1]相关,因为是需要的最低健康初值,那么自然是dp[i+1][j]和dp[i][j+1]中更小的那一个,但是最后怎么更新呢?我们从左上角开始进行动态规划,那么每个点需要记录到这个点需要的最小健康初值外,还需要记录到当前点的和,然而到一个点可以经过其左边or上边的点,这两个路径中,可能一个健康初值小,而另外一个健康值和更大,这两个因素都十分重要。如果重点是健康初始值的大小,那么选择蓝色路径,但是由于其和只有-1,重点右下角为-2,所需健康初值变成4;原创 2024-07-10 23:46:20 · 1061 阅读 · 0 评论 -
【动态规划Ⅳ】二维数组的动态规划——最小路径和
定义一个和原数组一样大小的二维数组,进行状态转移,其实和上面是一样的,只是需要一个新的数组。i < row;j++){// 定义新的数组i < row;i++){//单独处理每行第一个,其只能由上一行第一个转移而来// 正常处理,由上一行的j-1和j较小的一个转移而来j < i;j ++)//每行最后一个只能由上一行最后一个转移而来i < row;i++)原创 2024-07-10 23:45:51 · 1426 阅读 · 0 评论 -
【动态规划Ⅵ】背包问题 /// 组合问题
有一个容量为W的背包;现在有一些货品(体积wi,价值vi),总数为n。如果将一个货品放入背包,会消耗掉背包wi的空间,但同时会收获vi的价值。现在需要一个方案,选择一些物品,使背包能够装下,同时,收获的价值最大。这个问题就是背包问题~原创 2024-07-09 21:52:52 · 1556 阅读 · 0 评论 -
【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形
这个题目和上面是类似的,上面的dp[i][j]是以matrix[i][j]为右下角的,全部由1组成的正方形的数量,其实也就是以matrix[i][j]为右下角的正方形的最大边长。理解题意,是要我们找mat[i][j]离其周围的最近的0的距离,这里的周围是四个方向,上边[i-1][j]、下边[i+1][j]、左边[i][j-1]、右边[i][j+1]。可以先处理第一列和第一行,只要matrix[i][j]为1,dp[i][j]就等于1,同时统计的正方形子矩阵数量+1。【当然这里选择右下和左上的方向一样的】。原创 2024-07-09 21:51:56 · 1191 阅读 · 0 评论 -
【leetcode 力扣刷题】栈—波兰式///逆波兰式相关知识和题目
我们常看到的四则运算的计算式,比如2+3*(4-9),称为中缀表达式,人类去计算的时候知道这些运算符是有优先级的:()> */ > +-,但是让计算机去运算就有歧义了。上面的式子是很简单的,实际可以遇到很多层括号,计算机不会去括号的。因此就有了波兰式和逆波兰式。波兰式和逆波兰式里,没有括号,计算没有歧义。波兰式,也称为前缀表达式,即运算符在前面,数字在后面,上面的计算式转换成波兰式后为+2*3-49。原创 2023-09-13 22:52:57 · 702 阅读 · 1 评论 -
【leetcode 力扣刷题】栈和队列的基础知识 + 栈的经典应用—匹配
栈和队列是比较特殊的线性结构,特殊在于栈和队列中的元素不能随意的访问——对于栈,只能访问栈顶元素(用top()方法),只能向栈顶添加元素(用push()方法),只能从栈顶取元素(用pop()方法)。对于队列,则有两个开口,可以看作有两个口的管道,从一个方向把球塞进去(push()),从另外一个方向取出来(pop()),那么取出来的顺序还是和塞进去的顺序一样的,即。比如下图,依次入队是(出队也是)1,2,3,4,先放入栈A,再将栈A的元素依次取出并放入栈B,此时栈B内元素的出栈顺序也是1,2,3,4了。原创 2023-09-13 18:53:04 · 533 阅读 · 0 评论 -
【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求
题目中给出了平衡字符串的定义——只有’Q’,‘W’,‘E’,'R’四种字符,并且每种字符的数量都是n/4。将字符串s看作是待替换部分s1和剩下的部分s2,将s1替换成其他字符串后,能够保证新的s1插入s2后四种字符的数量都是n/4。判断一个字符串是否是回文串的时候,使用的是双指针,一个left从下标0开始,一个right从s.size()-1开始,然后如果s[left] == s[right],left++,right–;其下标用left和right表示,s1是s中[left,right)这一段子串。原创 2023-09-10 23:09:02 · 584 阅读 · 0 评论 -
【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)
如果以一个字符串作为中心,然后朝两边扩展,s[i~j]变成s[i-1~j+1],s[i-1~j+1]是否是回文串直接依赖于s[i~j]的,如果s[i~j]不是回文串了,再朝两边扩展是没有意义的。假设这个回文子串是s1,s除s1外的子串s-s1用s2表示,s^是s的逆序(反转)后的字符串,s1在s^中其实就是后缀,由于s1是回文串,所以s1 = reverse(s1)。理解题意,是要在words中找到两个字符串words[i]、words[j],使得words[i] + words[j]是回文串!原创 2023-09-08 20:37:53 · 730 阅读 · 0 评论 -
【leetcode 力扣刷题】字符串匹配之经典的KMP!!!
一个字符串从第一个字符开始的,不包括最后一个字符的子串;原创 2023-09-03 15:46:32 · 3316 阅读 · 0 评论 -
【leetcode 力扣刷题】数学题之数的开根号:二分查找
假设有函数f(x) = x^2 - C,其中C等于题目给出的x,函数f(x)的零点就是±根号C,其中正的那个向下取整就是答案。牛顿更新法首先将x0初始化为C,在(x0, f(x0))处的切线斜率为2*x0,切线与x轴的交点为x1 = (x0^2 +C/(2*x));用上面题的方法求得其向下取整的平方根ans,如果ans*ans == num,就说明其是完全平方数,如果ans*ans < num,说明其不是完全平方数。我们知道如果y>=2的话,y*y >= 2*y,所以我们不需要遍历1~x,只需要遍历。原创 2023-09-02 18:47:36 · 802 阅读 · 0 评论 -
【leetcode 力扣刷题】数学题之计算次幂//次方:快速幂
原创 2023-09-02 15:15:14 · 836 阅读 · 0 评论 -
【leetcode 力扣刷题】数学题之除法:哈希表解决商的循环节➕快速乘求解商
判断dividend里面还能不能有一个完整的divisor,是需要|dividend| >= |divisor|,因为都变成了负数,即dividend <= divisor就证明dividend里面有至少一个divisor,商还能加上一部分。,即第一次是+7,之后是+(7+7),再下一轮是+[(7+7)+(7+7)],每一轮要加的是上一轮的2倍,这个两倍直接用add = add + add来实现,也不需要乘法。快速乘,即用加法来实现乘法,但是不是一个一个加,而是将数字每次翻倍,成倍成倍的加。原创 2023-09-01 21:59:29 · 728 阅读 · 0 评论 -
【leetcode 力扣刷题】汇总区间//合并区间//插入区间
因为当前答案数组的最后一个区间的left是比待加入的区间left更小的,答案区间数组中的区间是没有重叠的,那么答案数组中的最后一个区间的left肯定是大于再前面一个区间的right的,待加入区间的left肯定是比答案数组中倒数第二个区间的right更大的。原创 2023-08-30 21:56:52 · 474 阅读 · 0 评论 -
【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)
‘ ’,就是找到了单词,应该直接保留:①slow == 0,表示这是第一个单词开始,单词前不能有空格,那么从当前的s[fast]!式子end == s.size() || s[end] == ‘ ’需要把end == s.size() 写在前面,如果把s[end] == ‘ ’写在前面而end = s.size()的话,就会出现下标越界。理解题意,其实和上一题反转单词是一样的思路,把前k个字符看成单词1,剩下的字符看成单词2,那就是把单词1和单词2交换顺序,单词内容的字符顺序是不变的。原创 2023-08-27 20:02:41 · 1488 阅读 · 0 评论 -
【leetcode 力扣刷题】双指针///原地扩充线性表
这个方法先定义一个新的字符串ss,需要申请额外的空间。从前往后遍历s的时候,如果s[i]!= ‘ ’,ss[j] = s[i],直接复制s的元素;如果s[i] == ‘ ’,那么ss[j]/ss[j+1]/ss[j+2]分别赋值‘%’,‘2’,‘0’,直到遍历完s。【注意】需要先遍历s,统计s中空格的数量,以确定ss的长度为s.size() + 2 * count。public://先统计s中的空格数量i++){count++;//申请新的空间s.size()+2*count。原创 2023-08-27 17:55:08 · 535 阅读 · 0 评论 -
【leetcode 力扣刷题】双指针//哈希表 解决链表有环等问题
slow从虚拟头结点开始,移动Size-n次,相当于移动到了被删除结点的前面一个结点【如果是一定要移动到被删除结点,那么终止条件改成fast==null即可,这样相当于fast从第n个结点移动到Size+1的位置,走了Size+1-n次,slow刚好走到Size+1-n结点的位置】。,如果n=1,x=z,即index1指针从head开始,index2指针从slow与fast相遇的节点开始,两个分别向前移动,移动相同次数,index1和index2会相遇,相遇处即为入环处;slow和fast相遇之后,原创 2023-08-23 23:55:38 · 460 阅读 · 0 评论 -
【leetcode 力扣刷题】交换链表中的节点
原创 2023-08-23 17:30:55 · 442 阅读 · 0 评论 -
【leetcode 力扣刷题】反转链表+递归求解
用一个slow指针,一个fast指针,初始slow和fast都为head【没有附加头结点时】,每次slow向后移动一个slow = slow->next,但是fast向后移动两个fast = fast->next->next。第一种方法最容易想到,从前往后遍历链表的同时,每次从原链表中取下当前节点,插入到新链表的开头。这个方法最好理解,也没有什么难度,先遍历链表取出各个节点的val,按原顺序存在vector中,在vector上实现回文判断,需要额外的空间……递归的时候需要一个指针,递归到最后向前返回。原创 2023-08-22 15:17:06 · 336 阅读 · 0 评论 -
【leetcode 力扣刷题】移除链表元素 多种解法
此时的新head对应节点的值是否等于val呢,如果等于val,那么新的头节点也要删除,删除以后head再次赋值head = head->next。——删除节点的时候,需要有当前节点currNode的指针,也需要其前驱节点preNode的指针【删除节点的时候,需要将其前驱节点的next指向后驱节点。③对于当前节点,判断是否满足题意,如果等于val就删除,那么包括当前节点head在内的这一段链表的头节点就是head->next,返回head->next;链表的定义就是递归的,因此可以考虑用递归的方法求解。原创 2023-08-21 22:35:21 · 468 阅读 · 0 评论 -
【leetcode 力扣刷题】链表基础知识 基础操作
删除节点时,将被删除节点的前面节点和后面节点连接起来的同时,断开被删除节点和其前面一个、后面一个节点的连接,并且要释放掉被删除节点的空间:pre->next = cur->next;delete cur。在链表中的一个位置插入节点,需要先断开插入位置前后两个节点的链接,再和这两个节点建立新的链接:先cur->next = pre->next;构成的,数据域是一个节点的数据,指针域存储下一个节点的地址,下一个节点依靠上一个节点的指针域寻址。将尾节点看作是下一个节点是null的节点,处理和其他节点一样。原创 2023-08-21 15:27:58 · 803 阅读 · 0 评论 -
【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)
但是这样的int类型的n最多只能有10位,继续增大n就超出了int类型的范围,即便是64位的带符号的整数(最大为18446744073709551616),n的长度也只有20。,如果重复找新数的过程中得到的数p在之前是出现过的,那么之后找到的数到下一次找到p前,都是重复出现的,直到变成p以后又继续循环。理解题意:①正整数需要满足:能够被k整除的【即n%k=0】,仅包含数字1【比如11,1111,111…变成1以后,即便重复上述过程,也一直是1的循环,因此在重复得到新数的过程中,如果这个数等于1就停止。原创 2023-08-19 14:25:56 · 369 阅读 · 0 评论 -
【leetcode 力扣刷题】 两数/三数/四数之和 哈希表和双指针解题
这个博客是关于:找出数组中几个元素,使其之和等于题意给出的target 这一类题目的,但是各个题之间又有些差异,使得需要用不同的方法求解。可以分为两类:一类是哈希表,一类是双指针。接下来详细讲解。原创 2023-08-17 19:09:39 · 642 阅读 · 2 评论 -
【算法题】Acwing 13.14找出数组中重复数字
—考虑最坏的情况,就是n个数字,没有重复的,且i为0的时候,就去一直重复情况2,直到后面的n-1个数字都到了正确的位置,之后就一路i++,结束了!,数字范围是1~n,将其分成[1 , n/2 ]和[ n/2 + 1 ,n ]两个区间,分别统计这两个数字区间内数字的数量,肯定有一个区间内的数字个数比数字区间(end-start+1)更大;需要注意的是,最后的数字区间一定是只有一个数,这个数字就是答案,此时be = end,退出循环,故返回be和end都ok,但是不可以返回mid!原创 2021-04-25 10:37:33 · 321 阅读 · 0 评论 -
【算法题】蓝桥杯 试题H:子串分值
前面已经说到,每一层外层循环对应的所有的子串,规律是首字母相同,然后长度依次递增,那么cnt数组和ff值的记录,可以在前一次的基础上更改,不必对于每一个子串再单独写一个循环,去统计求ff。看见网上很多巧妙的求解,是说循环遍历字符串每一个字母,统计每一个字母对子串分值的贡献,然后求和——sum+=(i-j)*(j-k),其中S[i]=S[j]=S[k],且i与j之间以及j与k之间不存在S[p]=S[j]。暴力求解只能通过60%的示例🤡。原创 2021-04-23 21:53:35 · 877 阅读 · 0 评论 -
【leetcode 力扣刷题】数组交集(数组、set、map都可实现哈希表)
存在的问题是:因为nums1和nums2中存在重复元素,如果找到了nums1[index1] = nums2[index2],且在nums1中,nums1[index1] 有重复,即nums1[index1+1] = nums1[index1] ,且在nums2中,nums2[index2]有重复,即nums2[index2+1] = nums2[index2]。那么就可以用哈希表。再遍历nums2,同时出现在nums1中的元素,count[nums2[i]]- -,向结果数组ans中添加一次该元素。原创 2023-08-16 22:45:57 · 355 阅读 · 1 评论 -
【leetcode 力扣刷题】哈希表初尝试
哈希表是一种数据结构,也叫散列表。哈希表中存储的是键值对,即(key,value),根据key直接查找到对应value,也能快速查找key是否在哈希表中,时间复杂度是O(1)。理解:可以把数组看作是哈希表,把数组下标index看作是key,对应下标中存储的是value,通过key查找元素的时候,就像是通过下标index访问数组,直接定位array[index]。哈希表查找元素时,将key通过哈希函数(hashfunction)后映射为索引,通过该索引找到对应存储的value。242. 有效的字母异位词题原创 2023-08-16 02:11:18 · 395 阅读 · 1 评论 -
【leetcode 力扣刷题】旋转矩阵(循环过程边界控制)
下面的题目的主要考察点都是,二维数组从左上角开始顺时针(或者逆时针)按圈遍历数组的过程。顺时针按圈遍历的过程如下:对于每一圈,分为四条边,循环遍历就好。这时,对于四个角的元素的处理,可以将四条边的遍历分为以下两种情况:第二种:遍历每一条边时,就将该边所有未被访问的元素全部遍历;比如第一条绿色的,最后一个元素就访问了;然后第二条边黄色的就对应列的第二个开始,因为第一个已经被访问了;之后的边以此类推;代码实现(C++):59. 旋转矩阵Ⅱ螺旋矩阵 II题目内容如下:注意点是n*n的正方形原创 2023-08-14 23:31:45 · 972 阅读 · 0 评论 -
【leetcode 力扣刷题】滑动窗口 部分题解(记录)
直到substring中包含了t中全部元素,并且对应频数≥t中对应元素的频数。代码实现用distance表示两者差异,substring中新增一个t中的元素时,distance - 1,直到distance = 0,表示子串substring中包含了t中全部元素。,比如下面的情况:子数组[3, 1, 2 ,4]的和已经满足≥target,题意中说明了是正整数数组,那么再往后增加元素,子数组之和会继续增大(一定满足题意),但是子数组的长度也会增大,然而我们的目标是找到满足和≥target的长度最短的子数组。原创 2023-08-13 22:33:16 · 403 阅读 · 1 评论