自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 leetcode 55. 跳跃游戏

总的来说,这段代码使用了一个贪心策略。它始终尝试跳跃到当前能够到达的最远位置,并在此过程中不断更新最远可达位置。如果某个时刻发现无法到达当前位置,那么就可以确定无法到达数组的最后一个位置。作为输入,并返回一个布尔值,表示是否可以从数组的第一个元素跳跃到最后一个元素。所表示的最远可达位置,那么我们就无法到达当前位置,因此直接返回。为当前最远可达位置和新计算出的最远可达位置中的较大值。,那么说明我们可以到达数组的最后一个位置,因此返回。表示当前能够到达的最远位置。,我们查看从该位置可以跳跃的最大长度。

2024-02-25 19:46:21 697

原创 leetcode 50. Pow(x, n)

这个实现使用了递归和分解的方法,将大的指数分解为更小的部分,从而简化了计算。此外,它还特别处理了负指数和整数溢出的情况,确保了代码的健壮性。因此,空间复杂度在最坏情况下是 O(|n|)。然而,在平均情况下,空间复杂度仍然是 O(log(|n|)),因为递归树是平衡的。函数的时间复杂度都是 O(log(|n|))。这个实现是非常高效的,因为它利用了指数的性质来减少必要的计算量,并且递归调用栈的深度也相对较小。是0,任何数的0次方都是1,所以直接返回1。是1,任何数的1次方就是其本身,所以直接返回。

2024-02-25 19:13:35 636

原创 leetcode 21. 合并两个有序链表

这个算法的时间复杂度是O(n + m),其中n和m分别是两个输入链表的长度。空间复杂度是O(1),因为除了几个指针外,没有使用额外的空间。的指针,分别代表两个要合并的单链表的头节点。函数返回一个指向合并后链表的头节点的指针。循环结束后,如果其中一个链表还有剩余节点,代码将这些剩余节点直接连接到结果链表的末尾。当前节点的值,选择值较小的节点作为下一个合并到结果链表中的节点。它的主要目的是简化合并逻辑,避免在合并过程中处理头节点的特殊情况。指针,它指向合并后的链表的第一个实际节点。最后,函数返回虚拟头节点的。

2024-02-24 22:11:43 550

原创 leetcode 1. 两数之和

【代码】leetcode 1. 两数之和。

2024-02-24 22:06:15 518

原创 leetcode 9. 回文数

函数具有线性的时间复杂度O(log10(x))和线性的空间复杂度O(log10(x))。因此,整个函数的时间复杂度是O(log10(x)) + O(log10(x)) = O(log10(x)),其中主导项是O(log10(x))。综上,原算法的总时间复杂度是O(log10(x)),因为所有主导时间复杂度的操作都是O(log10(x))。因此,这个循环的时间复杂度是O(log10(x))。因此,这个循环的时间复杂度也是O(log10(x))。因此,这个循环的时间复杂度也是O(log10(x))。

2024-02-22 09:29:16 1388 1

原创 C++STL中vector模版类以及其迭代器的代码实现

定义了一个名为的模板类,该类是一个迭代器,用于遍历某种类型的数据结构(如数组、向量等)。这是前向声明,告诉编译器我们将要定义一个名为的模板类,其中tp是一个模板参数,代表迭代器将操作的数据类型。

2024-02-20 20:56:52 510

原创 leetcode 141. 环形链表 142. 环形链表 II

如果链表中存在循环,那么快指针和慢指针最终会在循环内的某个节点相遇。这是因为快指针的速度是慢指针的两倍,所以它们之间的相对距离(快指针的位置减去慢指针的位置)会随着时间的推移而增加。这个算法的时间复杂度是O(n),其中n是链表中的节点数。在最坏的情况下,快指针和慢指针会在循环中的最后一个节点相遇。这个算法的时间复杂度是O(n),其中n是链表中的节点数。在最坏的情况下,快指针和慢指针会在循环中的最后一个节点相遇。需要注意的是,这个算法只能用于检测链表中是否存在循环,并找到循环开始的节点。返回循环开始的节点。

2024-02-20 20:00:36 383

原创 leetcode 144. 二叉树的前序遍历 145. 二叉树的后序遍历

对于平衡二叉树,时间复杂度和空间复杂度都是O(log n),其中n是树中节点的数量。在实际应用中,由于二叉树的形态未知,我们通常假设时间复杂度和空间复杂度都是O(n)。后序遍历的顺序是“左-右-根”,即先遍历左子树,然后遍历右子树,最后访问根节点。注意:由于后序遍历的顺序是“左-右-根”,所以根节点的值是在左右子树都遍历完之后才添加到。注意:由于前序遍历的顺序是“根-左-右”,所以根节点的值是在遍历左右子树之前添加到。:这是公开的接口方法,用于开始后序遍历。:这是公开的接口方法,用于开始前序遍历。

2024-02-20 19:54:52 383

原创 leetcode 136. 只出现一次的数字

这个方法使用了异或(XOR)运算来解决问题。异或运算有一个特性:任何数和0做异或运算,结果仍然是原来的数;任何数和其自身做异或运算,结果是0。它只需要遍历数组一次,因此效率很高。空间复杂度是O(1),因为只使用了常数级别的额外空间。这个算法的时间复杂度是O(n),其中n是数组。

2024-02-20 19:44:00 402

原创 leetcode 94. 二叉树的中序遍历

这段代码是一个C++类Solution的实现,用于执行二叉树的中序遍历(Inorder Traversal)。中序遍历是一种树遍历方式,其遍历顺序是“左-根-右”。具体来说,首先遍历左子树,然后访问根节点,最后遍历右子树。:这是一个私有辅助方法,用于递归地执行中序遍历。它接受两个参数:一个指向TreeNode的指针root(代表当前遍历的节点),和一个类型的引用vec(用于存储遍历得到的节点值)。rootroot->valvec:这是公开的接口方法,用于开始中序遍历。它接受一个指向TreeNode的指针。

2024-02-20 19:16:34 449

原创 LeetCode 160. 相交链表

这种方法的时间复杂度是O(N + M),其中N和M分别是链表A和B的长度。空间复杂度是O(N),因为我们需要使用一个集合来存储链表A的所有节点。如果找到了,说明该节点也是链表A的一部分,因此它就是两个链表的交点,方法返回该节点。的交点,即它们共享的第一个节点。类型的指针,分别代表两个链表的头节点。的目的是为了快速查找一个节点是否在链表A中出现过。这个循环遍历链表B,对于链表B中的每个节点,使用。这个方法的目的是找到两个链表。容器来存储链表A中的所有节点。将包含链表A中的所有节点。的指针,表示交点的节点。

2024-02-20 19:06:44 423

原创 LeetCode 105. 从前序与中序遍历序列构造二叉树

前序遍历的第一个元素总是根节点,而在中序遍历中,根节点将数组分为左子树和右子树。通过找到根节点在中序遍历中的位置,我们可以确定左子树和右子树的范围,并递归地重建它们。然后,它遍历中序遍历数组,以找到与前序遍历数组中当前元素相同的元素。这个元素的索引在中序遍历数组中的位置将当前子树分为左子树和右子树。方法:这是公开的接口,外部调用者会使用这个方法来开始重建二叉树的过程。最后,它将左子树和右子树分别连接到当前创建的根节点上,并返回根节点。接下来,它创建一个新的树节点,其值为前序遍历数组中的当前元素(

2024-02-20 18:50:45 832

原创 LeetCode 4.寻找两个正序数组的中位数

由于这两个指针同时向前移动,并且每个元素只会被访问和处理一次,因此这个过程的时间复杂度是线性的,即 O(n + m),其中 n 是。并执行了一些常量时间的操作,它的时间复杂度也是 O(n + m),其中 n 和 m 分别是两个输入向量的大小。然而,这个操作的时间复杂度通常被包含在 O(n + m) 中,因为它与指针的遍历过程紧密相关。当一个向量遍历完时,它将另一个向量中剩余的所有元素添加到结果向量中。中的所有元素,且这些元素是排序的。函数的总时间复杂度是 O(n + m),其中 n 是。

2024-02-19 19:17:15 388 1

原创 LeetCode 19.删除链表中的倒数第N个节点 改进算法

之前的实现方法在这里。

2024-02-19 15:03:57 530 1

原创 LeetCode 46.全排列

请注意,为了使这段代码能够正常工作,您需要确保已经包含了。向量以包含下一个排列(按字典序)。当没有更多的排列时,前缀来限定标准库中的名称,或者您可以在代码开头使用。最后,函数返回包含所有排列的二维向量。函数来生成所有可能的排列。向量进行排序,然后使用。这个函数首先对输入的。

2024-02-19 14:53:45 635 1

原创 LeetCode 19.删除链表的倒数第N个节点

从链表的末尾移除第。

2024-02-19 14:13:59 393 1

原创 LeetCode 2.两数相加

这段代码是用于解决“两数相加”的问题,其中两个数是以链表的形式给出的,每个节点包含一个数字(0-9)和一个指向下一个节点的指针。链表的数字是反向存储的,例如数字。这段代码的主要逻辑是遍历两个输入链表,同时处理进位,并将结果存储在新的链表中。当两个输入链表都遍历完后,如果仍有进位,则将其添加到结果链表的末尾。是否为空,如果不为空,则获取它们当前节点的值,并将指针移动到下一个节点。如果有进位,则创建一个新的节点并设置其值为1,然后将。的目的是将这两个链表表示的数字相加,并返回一个新的链表表示相加后的结果。

2024-02-16 19:15:59 460 1

原创 插入排序的代码实现

在插入排序过程中,已排序部分始终保持有序,而未排序部分的元素逐个被插入到已排序部分中。这种算法的时间复杂度为O(n^2),其中n为数组的长度。虽然插入排序在处理大量数据时效率较低,但对于小规模数据或部分已排序的数据,它的性能可能相对较好。插入排序算法的工作原理是逐步构建有序序列。

2024-02-16 19:11:52 403 1

原创 分治算法的时间复杂度分析

分析算法的时间复杂度是必要的,因为这可以帮助我们了解算法的效率,从而在设计和实现算法时做出更好的决策。

2024-02-05 14:55:14 2028 1

原创 用双向链表实现栈和队列

前几天发了一篇关于模板类双向链表的文章,介绍了一些链表的基本情况,同时用c++的模板类实现了双向链表的基本结构和基础功能。今天想要写一些使用双线链表实现栈和队列的内容。因为栈和队列的性质只需要在头或者尾处增减元素,所以相对于顺序表来说,链表更适合,能够轻松的实现动态的栈和队列。

2024-01-30 20:29:45 689 1

原创 c++模板类——双向链表的代码实现和讲解

链表作为一种线性的数据结构,时计算机领域中非常重要的一部分,很多高级复杂的数据结构都是建立在链表的结构基础之上的,可以说掌握了链表就能给自己的数据结构学习过程奠定一个非常坚实的基础。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

2024-01-26 21:25:30 2039 1

原创 选择排序原理讲解及代码演示

前几天我上传了比较常用的集中排序的代码,相关的讲解打算以后一点点补全。今天先把选择排序的讲解内容发布出来,希望能对正在学习的人有所帮助。

2024-01-18 16:27:27 366 1

原创 常见的几种排序算法的代码演示

在学习了一段时间的编程后,我们就会开始接触排序算法,排序算法可以处理将一组无序的数据变为有序数据的问题,也是很多进阶算法的基础。排序算法种类繁多,但是对于刚刚开始学习变成不久的新人来说,能接触到的排序算法只有三种,冒泡排序、选择排序、插入排序。在次之后,就有一些进阶技巧了,例如希尔排序、堆排序、归并排序和大名鼎鼎的快速排序。今天就把这几种排序算法的代码演示展示给大家。

2024-01-12 22:36:38 416 1

原创 原地删除数组中等于val的元素并返回数组的新长度

给你一个数组nums和一个值val,需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,必须仅使用O(1)额外空间并原地修改输入数组,元素的顺序可以改变。不需要考虑数组中超出新长度后面的元素。要求时间复杂度为O(1)。

2023-09-17 21:14:29 179 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除