- 博客(26)
- 收藏
- 关注
原创 Leetcode 225. 用队列实现栈
栈是一种后进先出(LIFO, Last In First Out)的数据结构,而队列则是一种先进先出(FIFO, First In First Out)的数据结构。实现栈的关键在于如何用先进先出的队列来模拟后进先出的操作。类的实现思路是利用队列的正常操作(入队和出队),通过特定的元素旋转操作来模拟栈的后进先出的特性。这种方法在实现栈的操作时,尤其是。操作的时间复杂度为 O(n),其中 n 是队列(即栈)的当前大小。操作,需要进行多次队列操作,导致操作相对较慢。
2024-04-28 22:55:15 193
原创 Leetcode 232. 用栈实现队列
队列是一种先进先出(FIFO)的数据结构,而栈是后进先出(LIFO)。这里的关键思路是使用两个栈来模拟队列的操作,从而使得元素的入队和出队操作符合队列的特性。类有效地利用两个栈实现了一个队列的基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)以及判断队列是否为空(empty)。
2024-04-28 22:51:59 381
原创 字符串的右旋转操作
为了实现右旋转操作,可以采用三次反转(reverse)策略。这种方法不仅直观,而且效率高,特别适用于在不额外使用过多空间的情况下处理字符串的问题。个字符移动到字符串的前面,这种操作称为字符串的右旋转。
2024-04-28 21:43:13 441
原创 Leetcode 151. 反转字符串中的单词
本题要求实现一个功能,即给定一个字符串,将其中的单词翻转,同时去除多余的空格,使每个单词之间只有一个空格分隔,并且首尾没有空格。
2024-04-28 21:16:32 282
原创 Leetcode 18. 四数之和
四数之和问题的算法复杂度主要受到三重循环的影响,时间复杂度为 (O(n^3))。在空间复杂度方面,除了输出结果需要的空间外,主要是排序操作所需的 (O(\log n)) 空间。这种算法适用于元素数量不是非常大的情况,对于大数据集,这种 (O(n^3)) 的算法可能会变得不切实际。
2024-04-28 15:06:11 508
原创 Leetcode 28. 找出字符串中第一个匹配项的下标
题源:KMP算法是一种有效的模式匹配算法,可以在O(n + m)时间内检查字符串中是否包含一个子串,其中n是文本字符串长度,m是模式字符串长度。该算法通过减少不必要的字符比较次数来提高匹配效率。
2024-04-25 21:04:44 468
原创 54. 替换数字(第八期模拟笔试)
最坏情况下的空间复杂度是 ( O(n) )。这里的 ( n ) 指的是输入字符串的长度,而结果字符串可能达到 ( 6n ) 的空间占用。然而,空间复杂度通常表示为输入大小的最高次项系数,忽略常数和低阶项,所以我们将空间复杂度表示为 ( O(n) )。在最坏的情况下,字符串的连接操作可能需要时间复杂度为 ( O(n) ),其中 ( n ) 是最终字符串的长度。最坏情况下的时间复杂度是 ( O(n^2) ),其中 ( n ) 是输入字符串的长度。函数的时间复杂度是常数时间 ( O(1) )。
2024-04-25 18:20:35 1216 1
原创 Leetcode 541. 反转字符串 II
遍历字符串:从索引 开始,每次增加 来定位下一组需要处理的字符。这种方式可以确保每次处理完一组 字符后,直接跳到下一个 字符段的开始。反转判断:对于每个起始位置 :反转操作:使用 C++ STL 中的 函数对指定范围内的字符进行反转。 接受两个迭代器,分别是要反转的范围的开始和结束位置。
2024-04-24 21:13:53 336 5
原创 Leetcode 344.反转字符串
很简单,定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
2024-04-24 20:59:32 159 1
原创 Leetcode 15. 三数之和
排序:首先对数组进行排序。这样可以方便后续操作,并且可以有效地避免重复的三元组和简化三元组的查找过程。外层循环:遍历排序后的数组,但只需遍历到倒数第三个元素(因为需要至少三个元素来形成三元组)。此外,如果当前元素大于0,则终止循环,因为三个正数相加不可能为0。跳过重复元素:如果当前元素与前一个元素相同,则跳过此次循环,以避免重复的三元组。双指针寻找:设置两个指针(左指针)和(右指针),分别指向当前元素的下一个位置和数组的末尾。通过移动这两个指针来找出与当前元素相加为0的两个元素:结束条件:当左指针不再小于右
2024-04-24 20:22:11 179 1
原创 Leetcode 383. 赎金信(简单易记5行版)
题源:在这个解法中,我们使用一个大小为 26 的整数数组magCount来记录每个字符在magazine中出现的次数。我们假设输入的字符串仅包含小写字母。此方法有效跟踪了magazine中每个字符的供应情况,并对ransomNote的每个字符需求进行了检查。
2024-04-24 16:46:26 367 1
原创 Leetcode 454. 四数相加 II
题源:题目的核心是求解四个数组nums1nums2nums3, 和nums4中所有元素组合的数量,使得它们的和为 0。这道题可以通过哈希表来优化查找和计算过程,减少时间复杂度。
2024-04-23 20:58:04 301
原创 Leetcode 1. 两数之和
利用哈希表(在C++中是 ),我们可以在一次遍历中完成查找。哈希表提供了快速的查找时间,这对于本题的需求来说非常有效。初始化哈希表:遍历数组:返回结果:这种方法有效地将问题的时间复杂度降到了 O(n),因为每个元素只需遍历一次,并在哈希表中进行常数时间的查找。空间复杂度为 O(n),用于存储哈希表。假设 ,:
2024-04-22 22:57:12 315 1
原创 Leetcode 202. 快乐数
为了判断一个数字是否最终会陷入循环而不是结束在数字1,我们可以使用哈希集合(在C++中是 )来存储每一步生成的数字。如果我们生成了一个已经在集合中的数字,这意味着我们进入了一个循环,因此该数字不是快乐数。计算数字的平方和:检测循环:例如,对于 :由于最终得到了1,19是一个快乐数。
2024-04-22 22:35:02 388 1
原创 Leetcode 349. 两个数组的交集
为了快速查找两个数组的交集元素,我们可以利用哈希集合的特性,即快速插入和查找操作。初始化哈希集合:查找交集:构造结果向量:该函数通过两个 对象实现了高效的元素查找和去重。首先,将 的元素存入 以去重并提供快速查找功能;然后,通过检查 的每个元素是否已在 中出现来确定其是否属于交集。最终, 中存储的即是 和 的交集。假设 ,,函数会返回 ,因为 2 是两个数组的共同元素,并且在结果中只显示一次。
2024-04-22 21:59:35 370 1
原创 Leetcode 242. 有效的字母异位词
题源:这段代码定义了一个函数isAnagram,用于检查两个输入字符串s和t是否为字母异位词。字母异位词是指两个字符串的字母相同,但排列不同的词。现在,我们将逐步分析这段代码,并提供一个详细的题解。
2024-04-22 21:19:52 506 3
原创 Leetcode 02.07. 链表相交
解题思路是先遍历两个链表获取它们的长度,然后让长链表的指针先走两链表的长度差步,接着同时遍历两个链表,查找相交的节点。这个函数利用链表长度差来减少不必要的比较。通过确保两个链表从距离尾部相同距离的位置同步开始遍历,使得它们能在相交点相遇,如果有的话。例如,有两个链表A和B。链表A的节点是 ,链表B的节点是 ,其中值为4和5的节点是共享的。根据该算法,链表A和B的长度分别是5和3,长度差是2。因此,我们让链表A的指针先移动2步,然后两个指针同时移动,它们会在值为4的节点相遇,该节点就是所求的交点。
2024-04-20 23:20:25 409 1
原创 Leetcode 19. 删除链表的倒数第 N 个结点
这个解法使用了两个指针——(慢指针)和(快指针),以及一个哑节点来简化头节点的处理。快指针先行走 步,然后慢指针和快指针一起移动,直到快指针到达链表末尾。此时,慢指针正好在倒数第 个节点处,可以进行删除操作。初始化哑节点:创建一个哑节点 并将其 指针指向 。这一步是为了简化在头节点前删除节点的操作。快慢指针定位:同时移动两个指针:当快指针 不为空时,同时移动 和 直到 指向链表末尾的 。此时,慢指针 指向的是倒数第 个节点。删除节点:将慢指针 的 指向 ,从而跳过了当前 节点,实现
2024-04-20 22:58:37 377
原创 Leetcode 24. 两两交换链表中的节点
这个解法采用迭代方法,通过更新链表的指针来交换相邻的节点。使用了一个哑节点(dummy node)来简化边界条件,特别是链表头部的处理。这个函数通过使用哑节点来避免复杂的头节点检查。这是一个常见的技巧,因为它可以减少特殊情况的检查,使代码更加简洁。同时,这个函数还精心管理了节点间的指针关系,确保了节点交换的正确性,并在结束时释放了哑节点以避免内存泄露。
2024-04-20 22:26:43 381
原创 Leetcode 206. 反转链表
题源:反转单链表该过程涉及重新指向链表中每个节点的next指针,使它们指向前一个节点,而不是下一个节点。curheadpreNULLtempcurcurcurNULLtempcurcur->nextcur->nextprecurcur->nextprenextprecurprecurtempcur->nextcurcurNULLprecurnextprepre这种方法是反转单链表的经典实现,使用三个指针(curpretemp)来逐步逆转节点间的链接方向,直至整个链表的顺序被反转。
2024-04-19 22:25:21 393 1
原创 Leetcode 203.移除链表元素
题源::函数首先创建一个值为 0 的虚拟头结点dummyHead。虚拟头结点的next指针指向链表的真实头结点head。这样做的好处是可以统一处理头结点和非头结点的删除操作,特别是当头结点也需要被删除时。:使用一个指针cur(当前指针),并将其初始化为指向虚拟头结点dummyHead。这个指针将用于遍历整个链表。:使用一个循环,让cur指针遍历整个链表。循环的条件是cur->next不为NULL,这意味着只要当前指针的下一个结点存在,循环就会继续。:在每次循环中,首先检查cur指针的下一个结点(即。
2024-04-19 22:02:55 275 1
原创 Leetcode 209.长度最小的子数组
本题可以利用滑动窗口(双指针技术)来解决。滑动窗口是一个常用来解决数组/字符串相关问题的技术,特别是涉及到连续子数组问题时非常有效。初始化:创建两个指针 和 ,都指向数组的起始位置。变量 用于存储窗口中元素的总和, 存储满足条件的最小窗口长度。窗口扩展:移动右指针 扩大窗口,每移动一次就加上 的值到 。窗口收缩:当 大于等于 时,尝试收缩窗口。更新最小窗口长度 ,然后逐步移动左指针 减小窗口,同时更新 。更新结果:如果在遍历过程中找到了满足条件的窗口,更新 为最小长度。如果未找到,则 保持
2024-04-18 21:43:46 310
原创 Leetcode 977. 有序数组的平方
题源: 977. 有序数组的平方说明:双指针方法:通过设置两个指针,一个在数组的开始(left),一个在数组的末尾(right),我们比较两端的绝对值大小,将较大的值的平方放在结果数组的末尾(由 i 控制),然后移动相应的指针。时间复杂度:这种方法只遍历数组一次,因此时间复杂度是 O(n),其中 n 是数组 nums 的长度。空间复杂度:使用了一个额外的数组来存储结果,空间复杂度是 O(n)。Codeclass Solution {public: vector<int&g
2024-04-18 10:31:11 322
原创 Leetcode 27. 移除元素
经典的双指针技术,这里称为快慢指针。其中,(快指针)遍历数组,(慢指针)跟踪新数组的填充位置。这种方法有效地在原数组上进行操作,避免了使用额外空间。初始化: 指针初始化为 ,用于指示新数组的当前填充位置。遍历数组:返回结果:循环结束后, 指针的位置表示了新数组的长度,因此直接返回 。假设 ,:时间复杂度:O(n),其中 n 是数组 的长度。这是因为我们需要遍历整个数组一次,来检查每个元素是否需要被移除。空间复杂度:O(1),我们没有使用额外的数组或数据结构,所有操作都在原数组上完成。拓展主要类型的双指
2024-04-17 22:57:02 1392
原创 Leetcode704. 二分查找(13行 不用记while是>=还是> 和 r是mid还是mid + 1版)
初始化边界:初始化为-1和为。我们定义 target 是在一个在左开右开的区间里,避免记混r和l应该更新为mid还是mid + 1。这样一来,r和l就都更新为mid了。二分查找循环:循环条件是,意味着两个指针之间至少有一个元素。计算中点为,这样可以避免整数溢出的风险。根据与的比较,更新搜索边界:如果,说明目标值在左半部分,更新。如果,说明目标值在右半部分,更新。如果,找到目标值,返回。搜索结束:如果退出循环,说明没有找到目标值,返回-1。时间复杂度:空间复杂度:
2024-04-17 22:11:33 800
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人