- 博客(74)
- 收藏
- 关注
原创 删除排序链表中的重复元素--LeetCode
这道题目思路十分清晰,首先创建新的指针来依次遍历,若出现重复,则删除,不同就继续遍历。删除所有重复的元素,使每个元素只出现一次。给定一个已排序的链表的头。
2025-06-19 10:00:00
228
原创 反转链表二--LeetCode
一致,就是多出了反转的范围,我们依旧采用三个指针来记录数据,将pre指针定位到要反转的前一位,只需将指针遍历left-1次,定义cur指针为pre的下一个指针,然后进行right-left次遍历,先将前两个链表进行转换,再将转换后的视为一个整体,继续进行right-left次转换,就可将链表中特定区域进行指针反转。
2025-06-18 19:40:15
406
原创 图书整理--LeetCode
书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。本题主要是将链表进行反转,就可以使用栈的特性-先进后出,那么对于队列而言,只需将链表依次插入队列头部,这个队列就是倒序了,也可以实现栈的特性。输入:head = [3,6,4,1]输出:[1,4,6,3]
2025-06-18 19:15:25
234
原创 赎金信--LeetCode
的思路相近,相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
2025-05-27 09:00:00
345
原创 有效的字母异位符--LeetCode
从另一个角度考虑,t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。t 是 s 的异位词等价于「两个字符串排序后相等」。此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
2025-05-26 17:37:10
247
原创 环形链表2--LeetCode
slow 指针进入环后,又走了 b 的距离与 fast 相遇,环内剩余距离为c。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 2(a+b) = a + b + n(b+c),化简可得a = (n-1)(b+c)+c,由于n大于等于1,于是先定义为1,此时等式就变为a = c。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。遍历链表,并将链表每一个元素进入哈希集合中,若再次出现,则为环的起始位置。链表中有一个环,其尾部连接到第一个节点。,则在该链表中没有环。
2025-05-26 09:00:00
353
原创 链表相交--LeetCode
如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 B 中,相交节点前有 1 个节点。
2025-05-25 20:45:40
1072
原创 删除链表的倒数第N个结点--LeetCode
根据栈「先进后出」的原则,我们弹出栈的第 n 个节点就是需要删除的节点,并且目前栈顶的节点就是待删除节点的前驱节点。为了方便删除操作,我们可以从哑节点开始遍历 L−n+1 个节点。当遍历到第 L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1 个节点时,它就是我们需要删除的节点。为了与题目中的 n 保持一致,节点的编号从 1 开始,头节点为编号 1 的节点。个结点,并且返回链表的头结点。
2025-05-25 11:02:05
410
原创 两两交换链表中的节点--LeetCode
用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。两两交换链表中的节点之后,新的链表的头节点是 dummyHead.next,返回新的链表的头节点即可。
2025-05-24 20:38:25
664
原创 反转链表--LeetCode
在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。→nk−1→nk→nk+1←…←nm我们希望 nk+1的下一个节点指向 nk。→nk−1→nk →nk+1→…→nm→∅,若从节点 nk+1到 nm已经被反转,而我们正处于 nk。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?需要注意的是 n1的下一个节点必须指向 ∅。假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。,请你反转链表,并返回反转后的链表。
2025-05-24 19:42:47
531
原创 设计双向链表--LeetCode
实现 addAtIndex(index, val) 时,如果 index 是有效值,则需要找到原来下标为 index 的节点 succ 和前驱节点 pred,并创建新节点 to_add,再通过各自 prev 和 next 变量的更新来增加to_add。然后找到下标为 index 的节点的前驱节点 pred 和后继节点 succ,再通过各自 prev 和 next 变量的更新来删除节点,来达到删除节点的效果。实现双向链表,即每个节点要存储本身的值,后继节点和前驱节点。以指示链表中的上一个节点。
2025-05-22 18:31:16
377
原创 设计单链表--LeetCode
实现 addAtIndex(index, val) 时,如果 index 是有效值,则需要找到原来下标为 index 的节点的前驱节点 pred,并创建新节点 to_add,将to_add 的后继节点设为 pred 的后继节点,将 pred 的后继节点更新为 to_add,这样就将 to_add 插入到了链表中。然后找到下标为 index 的节点的前驱节点 pred,通过将 pred 的后继节点更新为 pred 的后继节点的后继节点,来达到删除节点的效果。实现单向链表,即每个节点仅存储本身的值和后继节点。
2025-05-21 13:29:41
433
原创 移除链表元素--LeetCode
对于给定的链表,首先对除了头节点 head 以外的节点进行删除操作,然后判断 head 的节点值是否等于给定的 val。如果 temp 的下一个节点不为空且下一个节点的节点值等于给定的 val,则需要删除下一个节点。如果 temp 的下一个节点的节点值不等于给定的 val,则保留下一个节点,将 temp 移动到下一个节点即可。当 temp 的下一个节点为空时,链表遍历结束,此时所有节点值等于 val 的节点都被删除。也可以用迭代的方法删除链表中所有节点值等于特定值的节点。给你一个链表的头节点。
2025-05-20 12:10:31
621
原创 JAVA链表
接下来说一说链表的定义。链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数有同学说了,我不定义构造函数行不行,答案是可以的,C++默认生成一个构造函数。
2025-05-20 09:00:00
618
原创 开发商购买土地
然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。请输出一个整数,代表两个子区域内土地总价值之间的最小差距。
2025-05-19 12:00:00
354
原创 区间和--LeetCode
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。输出每个指定区间内元素的总和。
2025-05-19 08:00:00
153
原创 螺旋矩阵--LeetCode
如果 left<right 且 top<bottom,则从右到左遍历下侧元素,依次为 (bottom,right−1) 到 (bottom,left+1),以及从下到上遍历左侧元素,依次为 (bottom,left) 到 (top+1,left)。遍历完当前层的元素之后,将 left 和 top 分别增加 1,将 right 和 bottom 分别减少 1,进入下一层继续遍历,直到遍历完所有元素为止。例如,下图矩阵最外层元素都是第 1 层,次外层元素都是第 2 层,剩下的元素都是第 3 层。
2025-05-18 11:32:41
661
原创 Java 算法入门:从基础概念到实战示例
在计算机科学领域,算法如同魔法咒语,能够将无序的数据转化为有价值的信息。对于 Java 开发者而言,掌握算法不仅是提升编程能力的关键,更是解决复杂问题的核心武器。本文将带领你走进 Java 算法的世界,从基础概念入手,结合具体实例,帮助你快速入门。。
2025-05-01 21:40:07
961
原创 Java初级学者必学内容及学习指南
Java 作为一门广泛应用的编程语言,其基础内容是深入学习和开发的基石。本文将系统梳理 Java 的基础知识点,帮助初学者快速入门,也为有一定经验的开发者提供复习参考。Java 具有诸多显著特性。它是面向对象的语言,将数据和操作封装在对象中,提高了代码的可维护性与可扩展性。同时,Java 是健壮的,异常处理机制让程序在遇到错误时能妥善应对;垃圾自动收集功能减轻了开发者管理内存的负担;强类型机制则保证了数据的安全性和稳定性。
2025-05-01 21:29:14
996
原创 水果成篮--LeetCode
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。你想要尽可能多地收集水果。你只有 两个篮子,并且每个篮子只能装单一类型的水果。每个篮子能够装的水果总量没有限制。你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组。一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。,返回你可以收集的水果的最大数目。棵树上的水果 种类。
2025-04-26 21:22:59
645
原创 长度最小的子数组--LeetCode
得到前缀和之后,对于每个开始下标 i,可通过二分查找得到大于或等于 i 的最小下标 bound,使得 sums[bound]−sums[i−1]≥s,并更新子数组的最小长度(此时子数组的长度是 bound−(i−1))。初始化子数组的最小长度为无穷大,枚举数组 nums 中的每个下标作为子数组的开始下标,对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得从 nums[i] 到 nums[j] 的元素和大于或等于 s,并更新子数组的最小长度(此时子数组的长度是 j−i+1)。
2025-04-26 20:16:48
768
原创 有序数组的平方--LeetCode
具体地,我们设negative为数组 nums 中负数与非负数的分界线,也就是说,nums[0] 到 nums[neg] 均为负数,而 nums[negative+1] 到 nums[n−1] 均为非负数。当我们将数组 nums 中的数平方后,那么 nums[0] 到 nums[negative] 单调递减,nums[negative+1] 到 nums[n−1] 单调递增。同样地,我们可以使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。
2025-04-25 21:16:59
721
原创 比较含退格的字符串--LeetCode
这样,我们定义两个指针,分别指向两字符串的末尾。每次我们让两指针逆序地遍历两字符串,直到两字符串能够各自确定一个字符,然后将这两个字符进行比较。一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。具体地,我们定义 skip 表示当前待删除的字符的数量。若该字符为退格符,则我们需要多删除一个普通字符,我们让 skip 加 1;若 skip 不为 0,则说明当前字符需要删去,我们让 skip 减 1。两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回。
2025-04-25 10:00:00
345
原创 移动零--LeetCode
给定一个数组 nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。遍历数组找出等于0的数,再进行向前覆盖操作,结束后,将后面的数遍历成0。请注意,必须在不复制数组的情况下原地对数组进行操作。慢指针表示新数组非0数组的下一个下标。快指针表示寻找非0数组的下标。
2025-04-24 09:44:34
272
原创 删除排序数组中的重复项--LeetCode
给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。返回k。
2025-04-24 08:32:26
228
原创 移除元素--LeetCode
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。left在前来判断是否为删除元素,right在后面判断不为删除元素的有哪些。
2025-04-23 19:35:27
300
原创 有效的完全平方数--LeetCode
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。给你一个正整数num。如果num是一个完全平方数,则返回true,否则返回false。不能使用任何内置的库函数,如sqrt。
2025-04-19 15:00:00
331
原创 x的平方根--LeetCode
给你一个非负整数x,计算并返回x的算术平方根,由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x**0.5。
2025-04-19 10:00:00
387
原创 在排序数组中查找元素的第一个和最后一个位置--LeetCode
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
2025-04-18 19:45:47
1465
2
原创 搜索插入位置--LeetCode
在计算二分法的中间值middle时,要使用 i + (j - i) / 2 而不是 (i + j) / 2 是为了避免整数溢出。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
2025-04-18 08:54:22
308
原创 二分查找-LeetCode
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
2025-04-17 20:35:30
303
原创 数组理论基础
通过合适的索引,可以快速访问数组中的元素。2. 数组的长度不可变:一旦数组被创建,其长度就不可改变,需要重新创建一个新的数组来改变长度。存储多个相同类型的数据:数组可以存储多个相同类型的数据,方便对数据进行批量操作。快速访问数据:通过索引可以快速访问数组中的元素,提高数据的读取效率。1. 元素:数组中的每个数据项称为元素,每个元素可以通过索引访问。3. 长度:数组中元素的个数,确定了数组的大小。通过索引可以访问数组中的元素,索引从0开始。可以通过索引修改数组中的元素的值。通过循环遍历数组中的所有元素。
2025-04-17 19:44:54
327
空空如也
移位运算(<<)他的运行原理是什么,求友友们解答
2023-11-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅