
datawhale力扣
文章平均质量分 78
灵海之森
一剑霜寒十四州
展开
-
背包问题题解概述
dp是个二维数组,第一维代表物品索引,第二维代表背包空间状态。dp[i][j]是指物品i 在背包空间j 的情况下所能放的最大价值。原创 2024-06-27 00:33:55 · 499 阅读 · 1 评论 -
力扣练习4.29-30
2.遍历变量,如果是小于x,就将第一个链表的指针节点指向该节点,并更新第一个链表的指针节点;最后也要更新原始链表的指针节点。4.为了防止第二个链表的尾节点指向不明确,导致可能的陷入环形结构,将其指向为空。:设置两个链表,分别装小于x和>=x的节点,最后将两个链表拼接。1.初始化两个新链表的头结点和指针节点,初始化链表的指针节点。3.拼接两个链表,将第一个的尾节点指向第二个链表的头节点。5.返回第一个链表的头节点。原创 2024-04-29 20:27:16 · 301 阅读 · 0 评论 -
力扣练习4.26
3.如果字符为运算符,说明当前数字已经确定了,根据当前数字的前面的运算符计算入栈的结果:加减简单,乘的话是要先弹出栈顶元素,当前数字和栈顶元素相乘,乘积入栈;除法,因为 Python 的 // 运算符在被除数为负数时会向下取整到更小的整数,而通常的数学操作是向零取整,所以要考虑栈顶元素的正负,是负数时需要用最原始的解法。假设我们有’{([])}‘,那么遍历字符串,对开放括号入栈,得到[’{', ‘(’, ‘[’ ],如果说下一个字符不是[所对应的],那么就说明位置错乱,直接返回false;原创 2024-04-27 17:53:59 · 1106 阅读 · 0 评论 -
力扣练习4.25
因为左子链表在奇数时会多一个中点,所以在同时合并两个子链表的前面位数的节点后,还需要加上左边剩余的节点。1.设置快慢指针,都从头节点开始,快指针一次移动两个单位,慢指针一个单位,当快指针移动到链表末尾时,慢指针位置就是中点。将整个链表拆成三部分,第一部分是头节点到left的前一个节点,第二部分是left到right的待反转区间,第三部分是right的下一个节点为头结点到尾部。链表的分割也是找中点,前面的题有过,与前面不同的是,这道题的中点是要包含在前面部分的,所以初始化fast不同;原创 2024-04-25 21:03:09 · 1096 阅读 · 3 评论 -
力扣练习4.23
如果重复,就将相邻的前一个元素另存为临时变量,并且循环判断相邻的后一个元素和其后的元素是否重复,重复则移动临时变量到下一个节点;将滑动窗口实现为双向队列,队列中存储索引,维护队列的第一个元素为窗口内最大值的索引,在每个窗口内取出第一个元素,在数组中访问即可得到每个滑动窗口内的最大值。3.状态转移方程:如果nums1[i-1] == nums2[j-1],则dp[i][j]=dp[i-1][j-1]+1;临时变量退出循环后,其下一个元素是与前面的任意元素都不重复的,因此将指针指向临时变量的下一个元素。原创 2024-04-23 21:43:07 · 1029 阅读 · 0 评论 -
力扣刷题4.22
解题思路1:时间复杂度O(n),纯粹遍历start = iif start!end = i。原创 2024-04-22 22:47:13 · 985 阅读 · 0 评论 -
排序算法集合
不过,由于在实际的排序过程中,堆排序的常数项较大,且缓存局部性较差,通常它的表现不如快速排序和归并排序。桶排序(Bucket Sort)是一种分布式的排序算法,通过将数据分散到多个有序的桶中,对每个桶内的数据进行排序,最后将各个桶的数据顺序合并,从而实现整个数组的排序。每次循环从待排序的数据中取出第一个元素,将它插入到已经排序的序列中的适当位置,从而得到一个新的、元素个数增加1的有序序列。它的工作原理是每次从未排序的部分找出最小(或最大,根据排序顺序)的元素,将它与未排序部分的起始位置元素交换。原创 2024-04-20 23:13:09 · 1055 阅读 · 0 评论 -
215. 数组中的第K个最大元素
3.检查k是否大于big+equal的长度,如果是,说明在small数组中;并且由于已经不在big+equal中了,所以要排除掉前big+equal长度的k,因此要更新k。1.初始化一个哨兵元素,遍历所有元素,分为大于该元素,等于该元素,小于该元素的,放在三个数组中。2.检查k是小于等于big的长度,如果是,说明在big数组中,继续递归。一般来说,直接sort排序,取对应位置元素即可。但是解题思路是一样的:排序+取值。但是做算法题不能这样取巧。4.最终返回哨兵元素。原创 2024-04-19 11:14:40 · 254 阅读 · 0 评论 -
力扣练习4.11
题目“576.出界的路径数”要求计算一个点从网格中的特定位置开始,最多移动N步后,有多少种路径可以使它移出网格的边界。每一步,这个点可以向上、下、左、右四个方向之一移动。原创 2024-04-11 17:54:00 · 713 阅读 · 0 评论 -
力扣练习 4.10
这个问题的复杂之处在于,单次从左到右或从右到左的扫描可能无法正确处理所有情况,因为对于任意位置的孩子,他们的糖果数取决于左右两边相邻孩子的评分。所以就先拿最小的饼干,尝试匹配最小的胃口,如果匹配上了,那就结果+1,跳过这对,继续;通过这个例子,我们可以看到,即使数组的第一个元素允许我们跳得很远,但由于在索引3的位置(值为0),我们无法前进到更远的位置,导致我们无法到达数组的末尾。这个算法的精髓在于贪心地在每个可能的跳跃区间内选择能跳得最远的位置作为下一次的跳跃目标,从而用最少的跳跃次数到达数组的末尾。原创 2024-04-10 20:12:03 · 759 阅读 · 0 评论 -
力扣练习4.9
这种隐式回溯的做法不仅适用于字符串操作,在处理数组或列表时,如果采用类似的不修改原数组(或列表)而是通过传递新的数组(或列表)副本的方式,也可以达到隐式回溯的效果。总之,这个条件确保我们只在同一层递归中遇到连续重复元素时跳过它们,从而避免在结果集中出现重复的组合,而不是阻止在递归的不同层次中重新选择先前已经考虑过的元素。这个条件的目的是为了确保,在这种同一层的遍历中,如果当前元素和前一个元素相同(即出现重复),我们将跳过当前元素,从而避免产生重复的组合。用于避免在递归过程中生成重复的排列。原创 2024-04-09 19:17:36 · 940 阅读 · 0 评论 -
力扣记录 4.8
遍历表达式:对于表达式中的每个字符,如果它是一个运算符(),则对该运算符执行以下步骤。分割表达式:将表达式在当前运算符处分割为两个部分,左半部分和右半部分。递归计算:递归地计算左半部分和右半部分可能产生的所有结果。合并结果:根据当前运算符,将左右两部分的结果组合起来。处理基本情况:如果表达式中没有运算符(即只有数字),则直接返回该数字作为结果。原创 2024-04-08 23:17:46 · 743 阅读 · 0 评论 -
779. 第K个语法符号
位置判断:通过比较k和2 ** (n - 2),我们可以确定k是在前半部分还是后半部分。注意,2 ** (n - 2)是前半部分的长度。翻转逻辑:当k在后半部分时,我们需要找到它对应的前半部分的位置,并翻转结果。因为后半部分的每个元素都是前半部分对应元素的逆。递归调用:通过递归,我们逐渐减小问题的规模,直到达到基本情况(n == 1)。递归主体:检查k是否在当前行的前半部分,如果在,那么其值与上一行的位置相同;同时可以观察当前层是由上一层组成了前半部分,由前半部分的反转组成后半部分。可以先逐层求字符内容。原创 2024-04-08 14:07:56 · 190 阅读 · 0 评论 -
反转链表 II力扣刷题
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。思路应该清晰:找到左右边界,切断形成子链表,反转该区间的子链表,与原始链表进行链接。原创 2024-04-08 00:18:58 · 323 阅读 · 0 评论 -
力扣练习3.28
定义一个布尔类型的动态规划数组。原创 2024-03-28 15:42:17 · 854 阅读 · 0 评论 -
力扣练习 3.27
定义。原创 2024-03-27 23:38:12 · 1240 阅读 · 0 评论 -
力扣每日练习(3.26)
对于本题,就是需要在最前面,维护一个虚拟节点-head-head.next的结构,然后修改虚拟节点的指针到第二个节点,head节点的指针指向后续节点,第二个节点的指针指向head节点,这样交换了节点,同时虚拟节点的指针也是指向更新后的头节点的。:完成当前递归分支后,递归会回到上一个状态,尝试另一种括号的添加方式,这可能涉及撤销上一步添加的右括号并尝试在其他位置添加,或者撤销一个左括号的添加并换成右括号。求的是最大子数组和,可以先假设每个数字都是可能的最大子数组的最后一位,可以先拿两个举例。原创 2024-03-26 21:11:07 · 1052 阅读 · 0 评论 -
力扣链表(反转、有无环)
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(在单链表中)。当我们谈论反转单链表时,我们指的是改变链表中元素的链接方向,使得链表的最后一个节点成为头节点,原本的头节点成为最后一个节点,其余节点也相应地反向链接。反转单链表的基本思路是遍历链表,将每个节点的指针指向它的前一个节点。给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。:就是将链表中的节点链接方向逆转,即每个节点的指针指向前一个节点。:链表中的第一个节点,是链表访问的起点。原创 2024-03-25 15:22:45 · 553 阅读 · 0 评论 -
力扣每日练习(3.20)补
我们可以定义一个二维的DP数组dp,其中dp[i][j]代表以(i, j)为右下角的最大正方形的边长。注意,这个定义是关键的,因为它让我们能够通过左边、上边和左上角的状态来决定当前位置的状态。原创 2024-03-21 20:23:05 · 810 阅读 · 0 评论 -
力扣每日练习(3.19)补
在一个完全二叉树(或任意二叉树,但我们用完全二叉树的性质来帮助我们进行计算)中,如果我们假设根节点的索引为0,则对于任意一个节点,其左子节点的索引为2 * index + 1,其右子节点的索引为2 * index + 2,其中index是该节点的索引。根据完全的定义,可以知道是最后一层的节点要尽可能靠近左边,那么不成立的条件就是最后一层的节点是这样的[1,4,56,null,13]这等于该节点左子树的深度加上右子树的深度。经过根节点的最长路径,这条路径由根节点的左子树的最大深度和右子树的最大深度组成。原创 2024-03-20 23:11:01 · 375 阅读 · 0 评论 -
力扣每日练习(3.18)补
如果是,那么就递归检查上下左右有没有陆地,这样就能找到该岛屿的所有部分,并且将其标记为已走过,这样根据岛屿的其中一个元素(最先被遍历到)就得到了这个岛屿存在,并且不会再重复计数。在每次递归,我们都计数,累加遍历到的1的次数。这样就每次遍历岛屿得到岛屿的面积,不断比较,得到最终结果。使用递归的方式,也就是深度优先搜索,需要确定终止条件,也就是badcase是什么情况出现的。矩阵就是越界,元素坐标不在这个矩阵里了,结合本题还要包括元素进海了。10后加当前节点的值,因此递归主体可以确定为当前路径值。原创 2024-03-20 22:00:31 · 361 阅读 · 0 评论 -
力扣每日练习(3.17)补
检查平衡并计算高度:在递归过程中,比较左右子树的高度差,如果任一子树不平衡,或者左右子树的高度差超过1,当前树就不平衡,返回特殊标记(-1)。因此可以根据前序遍历得到每个子树的根节点,得到根节点后,在中序遍历中就可以分割出左子树和右子树。递归进行,左右子树就是在根节点两边的。递归计算高度:定义一个递归函数,该函数对于给定的节点,如果树是平衡的,返回其高度;左子树和右子树就继续递归,左子树的值要满足小于当前节点,右子树的值大于当前节点。二叉搜索树的条件:当前节点的值一定大于左子树,一定小于右子树。原创 2024-03-19 23:31:21 · 339 阅读 · 0 评论 -
力扣每日练习(3.16)补
得到左右子树的分别的贡献后,先尝试计算以当前节点为根节点,加上左右子树的贡献的路径和,更新最大路径和;再往上看,需要和父节点一起,自己充当子树的贡献,也就是自己要返回自己加左子树或者右子树当中最大贡献的那个,作为子树贡献向父节点服务。同时为了向上一层根节点提供左子树的最大贡献,也必须比较出左子树的左右子树中贡献最大的那个,加上左子树的根节点,就是左子树的最大贡献。假设根节点和左右子树的最大贡献的和是最大路径和,那么这个左右子树的最大贡献都是大于等于0的。路径和 是路径中各节点值的总和。不要求一定走根节点。原创 2024-03-19 16:44:25 · 409 阅读 · 0 评论 -
力扣每日练习(3.15)补
检查是否找到宝藏:每当你到达一个死路(叶子节点),你检查一下手里的纸(当前路径)上记录的所有步骤加起来是否等于宝藏的位置(targetSum)。这时,你就会在纸上擦掉最后的记录(执行path.pop()),因为你要撤销最后的这一步,回到之前的状态。现在,我们按照这个思路来解释代码的执行过程: 开始探索:你从迷宫的入口(根节点)开始,手里的纸是空的。继续探索:回到岔路口后,如果还有没走过的路,你就按照同样的方式继续探索,直到探索完所有可能的路径。上一题的进阶,要求记录每条成功路径的具体路径。原创 2024-03-18 20:55:59 · 564 阅读 · 0 评论 -
力扣每日练习3.14
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。解题思路:模仿层序遍历的方法,需要加一个层数指示器,当层数为偶数,则反转列表。原创 2024-03-14 23:21:25 · 285 阅读 · 0 评论 -
力扣每日练习3.13
二叉树遍历。原创 2024-03-13 17:34:36 · 324 阅读 · 0 评论 -
力扣每日练习3.12
说明: 单词:由非空格字符组成的字符串。当遍历到正常的单词字母时,左指针左移,直到遇到空格,就添加当前边界的字符串到结果列表;逐个遍历,这样对于每对相邻子串都得到了他们的公共前缀,如果新的比上一个短,那就要取最短的,如果空了,那就返回空。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。解题思路:参照小学乘法的竖式解法,两个nums的数字逐个相乘。原创 2024-03-12 22:52:00 · 452 阅读 · 0 评论 -
力扣每日练习3.10
这里必须要提的是,回文字符串长度=right-left-1,因为最开始传入的左右指针是中点,肯定是相同的,如果扩展一次后不同了(不用管中间是否相同),左右指针还是移动到了不是回文字符串的外围一个单位,那么回文子串长度就是right-left+1-2。6.将得到的整数与左右边界比较,先与右边界比较,如果在右边界之内,那么返回整数值,否则返回右边界;**判断是否回文:**最直观的是用sorted函数,你要是倒排出来和原始的一样不就行了,但是这样肯定不对,对于小白来说,自己能想到的直观解法基本都是错的。原创 2024-03-11 12:51:39 · 938 阅读 · 0 评论