- 博客(48)
- 收藏
- 关注
原创 求数组中最长单调不降连续子数组的长度
单调不降的定义是:对于所有相邻的字符串,前一个字符串的长度小于或等于后一个字符串的长度,如果长度相等,则前一个字符串的字典序小于或等于后一个字符串的字典序。具体来说,对于相邻的字符串s[i]和s[i+1],需要满足s[i]的长度小于s[i+1]的长度,或者长度相等时s[i]的字典序小于等于s[i+1]的字典序。首先比较字符串的长度,如果长度不同,返回长度的比较结果;2.在长度相等的情况下,按字符串的字典序比较,字典序较大的字符串更大,如 chery > banana。即为最长的单调不降连续子数组的长度。
2025-06-15 10:39:49
306
原创 左右括号的最小处理次数
每次处理可以是一个单独的字符或一个有效的括号子串。多多君在处理一个由左结号(和右语号)组成的字符串,多多君每次处理时可以顺序读取一个字符或者一个有效括号子串,求问多多的最小处理次数。有效子串可以一次性处理,因此处理次数等于未被覆盖的字符数加上有效子串的数量。遍历字符串,遇到左括号时压栈,遇到右括号时弹出栈顶的左括号,并记录有效子串的位置。例如:“()”,“()()”“(()())”均有效括号子串,“)(”, "(()","()())"不是有效括号。((()))为有效括号子串,需要处理1次。
2025-05-11 21:33:11
492
原创 排序算法-基数排序
基数排序(Radix Sort)是一种,它通过(个位、十位、百位等)进行排序。或进行排序。每次排序都基于某一位(比如先排个位,再排十位,依此类推)。使用(如计数排序)作为子排序过程。,确定最大位数(决定排序轮数)。构建桶,0到9的桶按位入桶桶中的数据写回原数组,清除桶,准备下一轮排序,直到所有位数处理完毕,数组有序。
2025-05-10 16:18:46
365
原创 排序算法-桶排序
桶排序(Bucket Sort)是一种,它将待排序元素分到若干个中,每个桶单独排序(可以使用其他排序算法或递归桶排序),最后按顺序合并所有桶中的元素。桶排序适用于数据的情况,在理想情况下可以达到的时间复杂度,但最坏情况下可能退化为(如果所有元素都集中在少数桶中)。根据数据范围,划分若干个区间(桶)。例如,数据在[0, 100)之间,可以分成 10 个桶,每个桶范围。遍历数组,将每个元素放入对应的桶。可以使用插入排序、快速排序、归并排序等(如果数据量小,插入排序效率较高)。
2025-05-10 15:44:21
309
原创 排序算法-堆排序
是一种基于二叉堆(Binary Heap)数据结构的比较排序算法。它利用了堆这种数据结构的特性来进行排序,是一种选择排序的改进版本。
2025-05-10 11:05:15
421
原创 排序算法-归并排序
归并排序是一种对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序后,再用递归方法将排好序的半子表合并成为越来越大的有序序列。
2025-05-09 21:45:00
739
原创 排序算法-冒泡排序
冒泡排序一种简单的排序算法。它重复地走访过要排序的数列,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为元素会经由交换慢慢“浮”到数列的顶端。
2025-05-08 17:44:49
413
原创 LeetCode:翻转二叉树
空间复杂度:O(h) 递归栈空间(h为树高)使用队列实现BFS(广度优先)遍历,逐层交换。子节点入队前已完成交换,保证后续正确处理。:采用分治思想,先处理子树再处理根节点。时间复杂度:O(n) 每个节点访问一次。空间复杂度:O(w) w为树的最大宽度。,翻转这棵二叉树,并返回其根节点。:用栈模拟递归过程,显式控制遍历顺序。每访问一个节点立即交换其左右子节点。:广度优先遍历,逐层交换节点。给你一棵二叉树的根节点。最终返回完成翻转的根节点。时间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(h)
2025-05-08 17:04:43
486
原创 LeetCode:平衡二叉树
给定一个二叉树,判断它是否是 平衡二叉树。:时间复杂度O(n),空间复杂度O(n)。:存在重复计算,时间复杂度O(n^2)。递归栈空间(最坏情况下树退化为链表)维护一个HashMap记录节点高度。计算每个节点的左右子树高度差。在计算高度的同时检查平衡性。若子树不平衡则直接返回-1。递归检查左右子树是否平衡。自底向上计算每个节点的高度。在回溯过程中即时检查平衡性。在弹出节点时检查平衡性。每个节点仅被访问一次。使用栈模拟后序遍历。
2025-05-08 11:51:03
429
原创 分解正整数
要解决这个问题,我们需要将给定的正整数x分解为若干个数之和,使得这些数的乘积最大。对于整数分解,最优解是将x分解为尽可能多的3,如果剩余1则拆出一个3与1组成两个2。小红拿到了一个数x,她准备将x分解为若干个数之和,希望这些数乘积尽可能大。例如,x=7分解为3+3+1,但1与3组合成两个2(3+2+2)。:如果分解后的数中包含分数(如7分解为三个7/3),则需要计算分数的乘积并约分。例如,7分解为3+2+2,乘积为3×2×2=12。:如果x不能被3整除,则分解为分数形式,计算乘积并约分。
2025-05-08 10:02:33
490
原创 交替序列长度的最大值
使用动态规划来记录以每个数字结尾的最长满足条件的子序列长度。:对于每个数字,检查其奇偶性,并根据前一个数字的奇偶性来更新当前数字的动态规划值。1.奇偶交替排列:例如:"奇,偶,奇,偶,奇.…同理,如果当前数字是偶数,它可以接在任意一个比它小的奇数后面,因此更新。注意:挑选出来的数字可以任意排列组成S,不需要保持原本的相对顺序。如果当前数字是奇数,它可以接在任意一个比它小的偶数后面,因此更新。表示以第i个数字结尾且该数字为奇数时的最长子序列长度。,分别记录以奇数和偶数结尾的最长子序列长度,初始值为1。
2025-05-07 21:46:23
557
原创 移动二维矩阵
1、题目描述小红获得了一个 n行 m 列的二维字符矩阵,现在她要对这个字符矩阵进行向左循环移位。向左循环移位规则如下:每一行的每一个字母(除了第一个字母)都向左边移动一位。第一行第一个的字母移动到最后一行的最后一个位置,其它行的第一个字母移动到上一行的最后一个位置。例如:abcdefghi向左循环移位一次之后的结果是bcdefghia现在小红总共有q次询问,每次询问包含三个正整数 a,b,c,表示的问题是:原字符矩阵向左循环移位a次之后,第b行第c列的字符是什么?
2025-05-07 21:13:41
577
原创 LeetCode:二叉树的最大深度
递归法通过分解问题为子问题求解,分别计算左右子树的最大深度,再取较大值加 1(当前节点)。迭代法通过队列按层遍历节点,每遍历完一层,深度加 1。是指从根节点到最远叶子节点的最长路径上的节点数。个节点,并将它们的子节点入队。:根节点入队,初始化深度。计算左子树的最大深度。计算右子树的最大深度。
2025-05-07 16:32:08
508
原创 LeetCode:对称二叉树
递归法通过比较左右子树的对称性来判断整棵树是否对称。将左子树的左节点与右子树的右节点入队(比较外侧)。将左子树的右节点与右子树的左节点入队(比较内侧)。每次取出两个节点(左子树的节点和右子树的节点)。你可以运用递归和迭代两种方法解决这个问题吗?迭代法通过队列按层比较左右子树的对称性。比较左子树的左节点与右子树的右节点。比较左子树的右节点与右子树的左节点。:队列为空时未发现不对称,返回。:将根节点的左右子节点入队。给你一个二叉树的根节点。, 检查它是否轴对称。左右节点值不相等,返回。或值不相等,是则返回。
2025-05-07 16:12:57
406
原创 LeetCode:二叉树的后序遍历
递归法直接利用函数的调用栈实现后序遍历,代码简洁但可能因递归深度过大导致栈溢出。若右子树已访问或为空,则访问当前节点,并记录为已访问节点。将当前节点及其左子节点依次压入栈中,直到左子节点为空。若右子树未访问,则将当前节点重新压栈,并转向右子节点。弹出栈顶节点,检查其右子树是否已访问或为空。:创建空栈和空列表,从根节点开始遍历。:对当前节点的左子节点调用递归函数。:对当前节点的右子节点调用递归函数。:栈为空且当前节点为空时结束。:将当前节点的值加入结果列表。:当前节点为空时,直接返回。
2025-05-07 11:16:53
348
原创 LeetCode:二叉树的中序遍历
递归法直接利用函数的调用栈来实现中序遍历,代码简洁但可能因递归深度过大导致栈溢出。迭代法通过显式地使用栈来模拟递归的隐式栈调用,避免了递归可能导致的栈溢出问题。将当前节点及其所有左子节点依次压入栈中,直到左子节点为空。弹出栈顶节点(当前最左节点),将其值加入结果列表。转向当前节点的右子节点,重复上述过程。:当栈为空且当前节点为空时,遍历结束。:对当前节点的左子节点调用递归函数。:对当前节点的右子节点调用递归函数。:将当前节点的值加入结果列表。:当前节点为空时,直接返回。给定一个二叉树的根节点。
2025-05-06 21:36:27
356
原创 LeetCode:字符串解码
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。,然后弹出数字,将字符串重复数字指定的次数后重新压入栈。给定一个经过编码的字符串,返回它解码后的字符串。:栈可以帮助我们处理嵌套的编码字符串,每次遇到。:读取完整的数字(可能有多位),并将其压入栈。:开始处理,从栈中弹出字符直到遇到。:将字符串列表拼接成一个字符串。中所有整数的取值范围为。,表示其中方括号内部的。:读取完整的数字字符串。
2025-05-06 20:06:12
415
原创 LeetCode:返回倒数第k个结点
实现一种算法,找出单向链表中倒数第 k 个节点。(Fast-Slow Pointer)来找到链表的倒数第。已经越界(理论上不会发生,因为题目保证。仍在第 1 个节点,两者间隔 1(即。先移动 1 步,指向第 2 个节点,1->2->3->4->5 和。,只使用了常数级别的额外空间(可以移动到下一个节点(即。存储的是链表的节点总数。(倒数第 2 个节点是。,每次各移动一步,直到。:从头节点开始,移动。遍历链表,每移动一次。步即可到达目标节点。不是最后一个节点)。),没有额外空间消耗。本题相对原题稍作改动。
2025-05-05 21:15:53
625
原创 LeetCode:链表的中间结点
给你单链表的头结点 ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:示例 2:提示:链表的结点数范围是 使用快慢指针(Fast-Slow Pointer)来找到链表的中间节点:快指针(fast):每次移动 两步()。慢指针(slow):每次移动 一步()。当快指针到达链表末尾时,慢指针正好指向链表的中间节点。循环条件::确保快指针没有越界(适用于奇数长度链表)。:确保快指针可以移动两步(适用于偶数长度链表)。奇数长度链表:链表长度为奇数时,快指针最终会指向最后一个节点(
2025-05-05 20:50:34
389
原创 Leetcode:回文链表
当快指针到达链表末尾时,慢指针指向链表的中间节点。如果链表长度为奇数,慢指针指向正中间的节点,此时需要将慢指针移动到中间节点的下一个节点(即后半部分的起点)。:O(n),其中 n 是链表的长度。快慢指针遍历链表一次,反转后半部分链表一次,比较前后两部分一次。如果链表长度为偶数,慢指针指向前半部分的末尾,直接作为后半部分的起点。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。:O(n),因为需要使用额外的数组来存储链表的值。:从慢指针指向的节点开始,反转后半部分的链表。
2025-05-05 20:33:24
463
原创 LeetCode:环形链表II
指针再次到达,则链表中存在环。说明该节点是入环的第一个节点,直接返回该节点。,然后快慢指针同步移动,再次相遇的点即为入口。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。:O(n),最坏情况下需要存储所有节点。慢指针每次移动一步,快指针每次移动两步。:O(1),仅需两个指针,无需额外空间。,返回链表开始入环的第一个节点。,可以正确处理链表中有重复值的情况。如果有环,快指针最终会追上慢指针。,仅仅是为了标识链表的实际情况。:O(n),需要遍历整个链表。
2025-04-30 16:09:17
1408
原创 LeetCode:环形链表
指针再次到达,则链表中存在环。来表示链表尾连接到链表中的位置(索引从 0 开始)。说明链表无环(因为快指针已经到达链表末尾),直接返回。如果有环,快指针最终会追上慢指针(类似于跑步套圈)。说明该节点之前已经被访问过,链表存在环,直接返回。),因此可以正确处理链表中有重复值的情况。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。慢指针每次移动一步,快指针每次移动两步。:O(1),仅需两个指针,无需额外空间。,即快慢指针相遇,链表存在环,返回。:O(n),需要遍历整个链表。
2025-04-30 12:01:12
664
原创 LeetCode:删除排序链表重复元素
由于链表是已排序的,所以重复元素必定相邻,这使得我们可以通过一次遍历解决问题。空间复杂度是O(1),因为我们只使用了常数级别的额外空间。:首先检查链表是否为空,如果是空链表直接返回null。我们只保留每个值的第一个出现节点,跳过后续的重复节点。时间复杂度是O(n),因为我们只遍历链表一次。删除所有重复的元素,使每个元素只出现一次。如果值相同,就跳过下一个节点(通过。:最终返回处理后的链表头节点。给定一个已排序的链表的头。指针从链表头部开始遍历。链表中节点数目在范围。指针移动到下一个节点。
2025-04-30 10:38:01
284
原创 LeetCode:找到所有数组中消失的数字
你可以假定返回的数组不算在额外空间内。当数组元素全为正数且不允许修改符号时(比方法2更通用)。对应的索引处的值设为负数,表示该数字已出现。允许使用额外空间时,逻辑清晰,但空间效率低。,避免符号冲突(适用于元素全为正数的场景)。最后检查未被标记的索引,即为消失的数字。中的数字,并以数组的形式返回结果。你能在不使用额外空间且时间复杂度为。,则将其设为负数(标记为已出现)。(原地修改,仅返回结果占用空间)。(数组长度),标记该数字已出现。的数字,即为消失的数字。的索引,即为消失的数字。对应的索引处的值加上。
2025-04-27 21:56:58
301
原创 LeetCode:合并两个有序数组
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。一般的高手,看完上面的定义基本就会用来,不会的话,也可以看看下面的示例。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。最终,合并后数组不应由函数返回,而是存储在数组。需要合并 [1,2,3] 和 [2,5,6]。时间复杂度O((n+m)* log(n+m))需要合并的数组是 [] 和 [1]。需要合并 [1] 和 []。中,使合并后的数组同样按。
2025-04-27 17:40:04
362
原创 LeetCode:合并两个有序链表
新链表是通过拼接给定的两个链表的所有节点组成的。:当一个链表遍历完后,直接将另一个链表的剩余部分接在新链表末尾。将两个升序链表合并为一个新的。,将较小的节点接入新链表。(即新链表的真实头节点)。(仅使用常数级额外空间)。(方便统一处理头节点)。(遍历两个链表各一次)。
2025-04-26 22:21:20
280
原创 LeetCode:移动零
给定一个数组 ,编写一个函数将所有 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums = 输出: 示例 2:输入: nums = 输出: 提示:我们根据题目的时候,思路会是想着判断如果数组的值为0的时候进行交换移动,但我们将想法倒过来会容易解题,就是判断数组的值是非0元素的时候才进行交换移动!指针定义:(慢指针):指向当前可以放置非零元素的位置。(快指针):遍历数组,寻找非零元素。核心逻辑:当 时,交换 和
2025-04-26 21:15:38
196
原创 LeetCode:使用最小花费爬楼梯
给你一个整数数组 ,其中 是从楼梯第 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 或下标为 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:示例 2:提示:这道题和「爬楼梯」类似,但增加了「花费」的概念。我们可以用 动态规划(DP) 来解决:定义状态: 表示到达第 阶楼梯时的最小花费。由于可以选择从 或 开始,,。状态转移方程:到达第 阶的花费 = 当前阶的花费 + 从 或 爬上来的最小花费:最终结果:由于可以跨过
2025-04-23 12:32:06
231
原创 LeetCode:爬楼梯
假设你正在爬楼梯。需要 阶你才能到达楼顶。每次你可以爬 或 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:示例 2:提示:递推关系:,即爬到第 阶的方法数等于爬到 阶(最后一步迈 1 阶)和 阶(最后一步迈 2 阶)的方法数之和。边界条件:(只有 1 阶,1 种方法)(可以 1+1 或直接迈 2 阶)复杂度分析 时间复杂度:,因为递归树呈指数级增长,存在大量重复计算。空间复杂度:,递归栈深度最大为 。重复计算:比如计算 时, 会被计算多次,效率极低。优化递归:使用 存
2025-04-23 11:37:17
465
原创 排序序列操作次数
为了让序列a变成正序列,多多被允许可以重复多次做这样一个操作:选择序列 a 中的一个整数 a¡(1 <=i<= n)且满足 a¡>x,然后交换 ai 和x。, an ,其中对于任意 1<=i<= n 都有0<= ai <= 500。例如对于序列 a=[0,2,3,5,4]和x=1,可以通过3次上述操作使得序列 a变成一个正序列。2. 选择i= 3 (满足 a3>x),交换后状态为a= [0,1,2,5,4],x=3,1.选择i= 2 (满足 a2>x),交换后状态为 a=[0,1,3,5,4],x=2;
2025-04-21 21:11:30
525
原创 填充低洼区域
为了解决这一问题,多多希望通过尽量少的地形调整(即调整最少的测量点高度),使整个场地的高度呈现严格上升的形态。为了确保观众的安全和良好的视听效果,场地的地形高度需要进行合理调整,确保每个位置的高度都要高于前一个位置,从而避免因地形起伏造成的摔倒或视线遮挡。第一行为一个整数T, 表示共有T个测试数据(1 <= T<= 10)每组测试数据:第一行为一个整数n,表示山区的测量点高度总数(1<=n<= 100000)第二行有n个整数hi,表示每个测星点i的地形高度(1<= hi<= 100000)
2025-04-21 20:20:19
587
原创 求最小演员片酬
片酬的分配由团队成员共同商议决定,每位成员对演员的片酬标准有自己独特的评估意见,在团队讨论时,成员们可能会根据演员所饰演角色的杂性、表演难度、台词量等因素,提出不同的薪资调整建议。请你帮多多计算在满足所有制作团队成员的意见下,求出一个使得演员片酬总额最小的方案,每位演员的片酬必须至少为100元,且每次调整的增量为10元。要解决这个问题,我们需要根据给定的优先关系(即某些演员的片酬必须高于其他演员的片酬),为所有演员分配片酬,使得总片酬最小,同时满足每位演员的片酬至少为100元,且每次调整的增量为10元。
2025-04-21 11:36:01
1730
原创 多多构造新字符串
要解决这个问题,我们需要从给定的N个字符串中,每个字符串最多取出Xi个字符,然后按照字典序最小的方式组合成一个长度为K的新字符串。个字符,被取出字符可以按任意顺序拼接成一个长度为 K的新字符串T,但多多希望这个字符串的字典序尽可能的小。对于每个字符串Si,我们取出其中最小的Xi个字符(因为最小的字符在前面的位置可以使得整个字符串的字典序最小)。第一行,两个整数 N 和 K,表示有 N 字符串以及目标串T的长度接下来N行,第i行有一个字符串和一个整数:S,X;:读取输入的字符串数量N和目标字符串长度K。
2025-04-20 21:20:03
399
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人