自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【LeetCode周记】2025.8.31

在数组中找到两个数,使得它们的和等于目标值,可以首先固定第一个数,然后寻找第二个数,第二个数等于目标值减去第一个数的差。在此,我将自己的总结整理如下,希望能对学习二分查找的朋友有所帮助。对于这种情况,我们只能将当前二分区间的左边界加一,右边界减一,然后在新区间上继续二分查找。代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。两段都为升序数组,但两段升序不连接,可以先判断哪一部分是有序的,再进行二分。中每一行的元素都是升序排列的,因此我们可以对每一行都使用一次二分查找,判断。

2025-08-31 22:16:51 925

原创 【LeetCode题解】LeetCode 287. 寻找重复数

因此可以使用二分算法。进行二分的时候,就已经成功一半了。的数有多少个,假设我们重复的数是。继续这个过程直到找到重复数字。,说明重复的数字在区间。二分的题,当你找到要对。

2025-08-22 19:44:44 647

原创 【LeetCode题解】LeetCode 268. 丢失的数字

【题目链接】【题目描述】【题解】

2025-08-21 16:05:54 942

原创 【LeetCode题解】LeetCode 240. 搜索二维矩阵 II

【题目链接】【题目描述】【题解】

2025-08-21 15:20:14 400

原创 【LeetCode题解】LeetCode 209. 长度最小的子数组

【题目链接】【题目描述】【题解】

2025-08-20 16:20:36 300

原创 【LeetCode题解】LeetCode 162. 寻找峰值

函数,它直接定义了“如何根据中间位置的特征,判断下一阶段的搜索方向”。由于每道题的场景逻辑不同,真正的破题点永远是 结合问题条件,分析区间的“可二分性”,而非机械套用模板。二分算法的两类模板需要熟练掌握,但核心关键在于设计合理的。(即使数组严格递增,最后一个元素因右侧是。严格递减则第一个元素因左侧是。核心逻辑是:通过比较中间位置。这一条件至关重要:它保证了。的元素,且题目给定边界条件。由于要求时间复杂度为。

2025-08-19 20:28:10 778

原创 【LeetCode题解】LeetCode 153. 寻找旋转排序数组中的最小值

在最小值右侧的元素(不包括最后一个元素本身),它们的值一定都是严格小于。因此,我们可以根据这一条性质,通过二分查找的方法找出最小值。是最小值右侧的元素,因此可以忽略二分查找区间的右边部分,所以。是最小值右侧的元素,因此可以忽略二分查找区间的右边部分,所以。是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以。是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以。是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以。来判断最小值的位置,利用了数组旋转的特性。

2025-08-19 15:16:31 969

原创 【LeetCode题解】LeetCode 81. 搜索旋转排序数组 II

通过将左边界向右移动、右边界向左移动,可以有效跳过重复元素,逐步减少重复带来的影响。虽然这会增加查找次数,但能够保证查找过程的正确性,避免在重复元素导致的模糊区域中陷入死循环。在这种情况下,无法通过直接比较中点和边界的值来决定是继续向左区间还是向右区间查找。旋转排序数组中,如果数组存在重复元素,二分查找可能会遇到一些特殊情况。,缩小当前查找区间,并继续在新的区间上进行二分查找。对于数组中有重复元素的情况,二分查找时可能会有。,请读者在阅读完该题解后再继续阅读本篇题解。,然后在新区间上继续二分查找。

2025-08-18 15:27:09 316

原创 【LeetCode题解】LeetCode 74. 搜索二维矩阵

【题目链接】【题目描述】【题解】

2025-08-18 14:44:11 387

原创 【LeetCode题解】LeetCode 33. 搜索旋转排序数组

然而,在这道题目中,数组并不是完全有序的,而是经过旋转后,只保证了数组的某一部分是有序的。我们可以利用旋转数组的性质,通过判断数组的哪一部分是有序的,来调整查找范围,从而有效地应用二分查找算法。这两部分中哪一部分是有序的,然后根据这个有序部分来调整二分查找的上下边界。具体而言,若某一部分是有序的,我们就可以判断目标值。是否位于该有序部分内,从而决定是将查找范围缩小到该部分,还是缩小到另一部分。对于一个有序数组,我们可以使用二分查找算法来查找某个元素,具体的算法模板可以参考。在这道题中,我们可以通过判断。

2025-08-17 21:06:24 385

原创 【LeetCode题解】LeetCode 35. 搜索插入位置

通过题目可以知道这是一道经典的二分查找的题目,对于二分查找的题目,根据需要查找的两个边界点,分为两个不同的模板,如下图所示。,这导致在测试样例时,示例1和示例2都可以通过,但输入3确报了错。通过调试输出排查后发现,问题的根源在于边界值的设置。的场景,常用于定位满足特定条件的最小值或区间的左边界。这道题要求在数组中查找目标值并返回其索引,若目标值不存在,则返回它按顺序插入的位置。的设置确保了搜索区间覆盖所有可能的插入位置,而。二分查找的核心是明确搜索区间的定义,并。(即右边界),而原问题实际需要的是。

2025-08-16 20:07:02 1024

原创 【算法基础课-算法模板2】数据结构

C++ 标准模板库(STL,Standard Template Library)提供了一组高效、通用的容器与算法,极大地简化了日常开发中的数据结构操作。

2025-07-31 20:53:54 803

原创 【AcWing 840题解】模拟散列表

哈希表的大小为 N = 200003,这样可以减少冲突的概率(选取质数作为哈希表的大小有助于减少哈希冲突)。(即在发生冲突时逐步检查下一个位置),直到找到空位或匹配的位置。来高效地实现集合的插入和查询操作。,代表位置为空,避免与实际的元素。通过哈希碰撞解决,采用。

2025-07-27 11:43:10 225

原创 【AcWing 838题解】堆排序

在本题中,我们需要反复取出最小的元素,并将剩余元素调整为有效的堆,因此可以使用。插入操作:将一个元素加入堆中,并保持堆的性质。删除操作:删除堆顶元素,并重新调整堆结构。

2025-07-27 11:37:58 181

原创 【AcWing 836题解】合并集合

操作时,将访问路径上的每个节点直接指向根节点,从而加速后续查询。:将两个元素所在的集合合并为一个集合。:查询一个元素所在的集合。

2025-07-27 11:19:46 153

原创 【AcWing 143题解】最大异或对

从根节点开始,每个数按位插入,如果当前数的某一位是 1,那么它就沿着该位的路径插入树中。通过使用前缀树,我们能够将每个整数拆分成二进制形式,按照其二进制位插入树中,然后在查询时可以通过比较来找到最大可能的异或值。异或性质:我们要最大化的是两个数的异或值,而异或的性质决定了异或值越大,二者的对应位越不相同。查询最大异或值:当我们要查询一个数的最大异或值时,从当前数的二进制表示的每一位开始,尽量沿着与当前位不同的路径走。在插入每个数的同时,查询当前数和 Trie 树中已有数的最大异或值,并更新最大异或值。

2025-07-26 23:48:36 468

原创 【AcWing 835题解】滑动窗口

插入操作:遍历字符串的每个字符,通过Trie树构建路径。如果路径不存在,就创建新的节点。最终在路径的末尾节点上增加出现次数。查询操作:根据字符串的每个字符,沿着树路径向下查找。如果路径存在,则返回末尾节点的。Trie树是一种树形结构,用来存储字符串,其中每个节点表示一个字符。如果路径不存在,说明该字符串没有插入过,返回。每条从根节点到叶子节点的路径表示一个字符串。数组用于记录该节点对应的字符串出现的次数。可以高效地支持字符串的插入和查询操作。

2025-07-26 23:43:22 227

原创 【AcWing 154题解】滑动窗口

窗口每次向右移动一个位置,要求计算窗口中的最大值和最小值。为了解决这个问题,我们可以使用。效率:每个元素最多进入队列一次,且最多被删除一次,因此时间复杂度为。最大值:保持队列中元素的下标递减,从队列前面获取窗口的最大值。最小值:保持队列中元素的下标递增,从队列前面获取窗口的最小值。将新元素添加到队列,并维护队列中的元素顺序(递减或递增)。的方式来优化滑动窗口的最大值和最小值查询。双端队列的应用:利用双端队列来保持一个。移除已经不在当前窗口中的元素。的数组,并且有一个大小为。题目要求给定一个大小为。

2025-07-26 20:53:47 415

原创 【AcWing 830题解】单调栈

题目要求给定一个整数序列,对于每个元素,输出其左侧第一个比它小的元素。如果不存在这样的元素,则输出-1。我们需要通过遍历数组来寻找每个元素的左侧第一个比它小的元素。具体来说,对于每个新的元素,我们将其与栈顶的元素进行比较,直到栈顶的元素小于当前元素时,当前元素的左侧第一个小于它的元素即为栈顶的元素。2.如果栈为空,则说明当前元素左侧没有比它小的元素,此时输出 -1。3.依次处理所有元素,最终得到每个元素左侧第一个比它小的元素。的核心思想是栈中的元素是单调的,在这里我们可以让栈保持。

2025-07-26 20:36:54 266

原创 【AcWing 829题解】模拟队列

自增,表示队头元素被删除。用于存储队列中的元素。查询队头元素:直接输出。表示队列头部的位置,表示队列尾部的位置。来判定队列是否为空。

2025-07-26 00:05:38 283

原创 【AcWing 3302题解】表达式求值

当遇到运算符时,我们需要根据栈中的运算符优先级决定是否执行运算。时,依次弹出运算符栈中的运算符,并计算结果,直到遇到左括号。运算符栈中的优先级更高时,先计算栈顶的运算符。当遇到数字时,将其加入数字栈中。否则,将当前运算符压入栈中。时,将其压入运算符栈。

2025-07-25 23:52:32 266

原创 【AcWing 828题解】模拟栈

每次操作时,根据操作类型进行相应的栈操作。

2025-07-25 23:44:11 140

原创 【AcWing 827题解】双链表

删除操作:删除链表中的第 k 个节点,更新其前驱节点的右指针和后继节点的左指针。用于存储每个节点的左侧节点的索引。用于存储每个节点的右侧节点的索引。,将新节点插入到链表最后一个节点和。初始化链表:设定链表的左端点为。用来表示当前可用节点的索引。分别用来指示链表的左右端点。,表示链表从第二个节点开始。:在链表的左端插入一个值。:在链表的右端插入一个值。和链表第一个节点之间。个节点的左侧插入一个值。个节点的右侧插入一个值。,将新节点插入到节点。,将新节点插入到节点。

2025-07-25 23:32:43 141

原创 【AcWing 826题解】单链表

每次向链表头插入一个元素时,将当前元素存储到。,这样就跳过了要删除的节点,从而实现删除操作。个节点后插入一个新元素时,先将新元素存储到。存储链表中每个节点的下一个节点的索引。开始,表示链表的第一个节点。指向原来头部的位置,最后更新。来表示当前可用节点的索引。存储链表中每个节点的值。链表初始化:在初始化时,来表示链表头部的位置,,这样完成插入操作。

2025-07-25 22:20:46 225

原创 【算法基础课-算法模板1】基础算法

离散化是一种常用的算法技巧,特别是在处理区间、坐标、以及离散值范围较大的问题时。离散化的基本思想是将问题中的连续值转化为较小的离散值,从而使得计算变得更高效。在处理区间问题时,区间合并是一种常见且重要的技巧。它的核心思想是将多个重叠或相邻的区间合并为一个更大的区间,减少区间的数量。如果当前区间与已合并的区间重叠,就合并它们,否则将当前区间加入结果集。区间合并问题的核心是找到一组区间中的重叠部分,并将它们合并为一个大区间。3.将原始数据中的值替换成其在离散化后的索引,进而利用这些离散化后的索引进行后续操作。

2025-07-19 00:00:32 1160

原创 【AcWing 803题解】区间合并

说明当前区间与前面的区间没有交集,需要增加一个新的合并区间;否则,说明当前区间与前一个区间有交集,更新。用来记录当前区间的右端点。遍历每个区间,如果当前区间的左端点大于。这样可以保证区间的顺序有助于后续的合并过程。1.排序区间:首先将所有区间按照左端点。3.输出结果:最后输出合并后的区间数。如果左端点相同,则按照右端点。2.合并区间:初始化一个变量。为两个区间的最大右端点。

2025-07-18 19:36:19 205

原创 【AcWing 802题解】区间和

技术,将所有出现的坐标压缩到一个较小的区间内,这样不仅能有效节省内存,还能加速后续的查找和更新操作。,直接操作可能导致内存消耗过大或操作效率低下。为了解决这个问题,我们可以采用。算法进行高效计算,通过预处理前缀和数组,使得区间和查询可以在常数时间内完成。根据题目描述,数轴的坐标范围较大,取值从。

2025-07-18 19:29:02 272

原创 【AcWing 801题解】二进制中1的个数

函数的作用是提取一个整数的二进制表示中最低位的 1,它通过一个位运算。函数来高效地实现这一过程。具体做法是,对于每个数字。,最终计数即为二进制表示中 1 的个数。本题要求计算每个数字的二进制表示中。去除该位的1,每去除一个。

2025-07-18 19:12:35 267

原创 【AcWing 2816题解】判断子序列

已经是有序的,所以通过双指针能够高效地遍历并判断。首先,初始化两个指针。相等时,说明找到了一个匹配的元素,此时指针。,继续查找下一个元素。来解决这个问题,因为数组。中的所有元素都被匹配,即。不匹配,则继续移动指针。中还有未匹配的元素,即。向右移动,表示已处理。

2025-07-16 22:37:29 266

原创 【AcWing 800题解】数组元素的目标和

由于数组已经排序,因此这个方法的时间复杂度为。考虑到数组已经排序,我们可以使用。然后,使用一个循环遍历数组。首先,初始化两个指针。本题要求在两个升序排列的数组。,使得它们的和等于目标值。,在每次迭代中,通过调整。方法,具有更好的效率。

2025-07-16 22:20:19 196

原创 【AcWing 790题解】数的三次方根

不断缩小区间,直到左右边界的差小于一个精度阈值1e-8。此时,中间值即为逼近的三次方根。该算法利用二分法的高效性,时间复杂度为。,其三次方根也应在这个区间内。接下来,通过计算区间中点。由于三次方根可能是一个不规则的浮点数,我们可以采用。首先设定二分查找的左右边界为。,这是因为题目中给出的 n 范围是。,确保了高效的求解过程。,从而决定更新左边界。

2025-07-16 22:10:11 251

原创 【AcWing 788题解】逆序对的数量

该算法通过递归地将数组分割为较小的子数组,直到每个子数组只包含一个元素,然后在合并过程中计算逆序对。在合并步骤中,当我们合并两个已排序的子数组时,如果左子数组的元素。最简单的计算逆序对的方法是通过两层循环遍历数组,外层循环固定一个元素,内层循环从当前元素的下一个元素开始,比较每一对元素。通过这种方式,我们能够在排序过程中同时计算出逆序对的数量,从而提高计算效率,时间复杂度为。,在处理大规模数据时效率较低,因此在实际应用中,通常会选择更高效的算法,如基于归并排序的解法。的所有元素都大于右子数组中的。

2025-07-13 21:21:38 425

原创 【AcWing 786题解】第k个数

给定一个整数数组,要求找到数组中从小到大的第k个数。这个问题可以通过排序得到,但考虑到数据量较大,快速选择算法更适合该场景,因为它的时间复杂度为。题目要求我们从一个给定的整数数组中,找到排序后第k小的数。选择基准:选取一个基准元素,通过一次分区操作,将数组分为两部分:小于基准的部分和大于基准的部分。如果目标位置(k)位于大于基准部分,就递归选择大于基准的部分,并调整k值。如果目标位置(k)位于小于基准部分,就递归选择该部分。的思想,但与快速排序不同的是,快速选择。,而不对整个数组进行排序。

2025-07-13 17:13:00 259

原创 【算法基础1-1】排序算法之快速排序和归并排序

无论是从数据库管理系统中的索引构建,还是在大数据处理中数据的分组,排序算法都扮演着至关重要的角色。排序算法,它通过将一个数组递归地拆分成两个子数组,分别对这两个子数组进行排序,再将两个有序的子数组合并成一个有序的数组。归并排序的空间复杂度为O(n),这是因为在合并操作时,我们需要使用额外的存储空间来存储临时数组(左子数组和右子数组)。稳定性意味着,如果两个元素的值相等,它们在排序后的数组中的相对顺序不会改变。这个过程是通过逐个比较两个子数组中的元素,将较小的元素放入结果数组中,直到所有元素都被合并。

2025-07-06 22:19:41 1010

原创 【语法基础4】链表(Linked List)

链表是一组节点的集合,每个节点通过指针连接形成一个线性结构。节点1 --> 节点2 --> 节点3 --> ... --> 节点n --> null数据域:存放节点的数据指针域:存放下一个节点的地址。

2025-07-04 23:37:49 983

原创 【语法基础3】类、结构体、指针、引用

类的定义由关键字class引入,描述了一种数据类型。类中可以包含数据成员(变量)和成员函数(方法)。示例:定义一个简单的Person类public:int age;在这个例子中,Person类有两个成员变量(name和age)和一个成员函数(),用于输出自我介绍。结构体使用关键字struct进行定义。与类类似,结构体也可以包含成员变量和成员函数。示例:定义一个简单的结构体int pages;上述代码定义了一个Book结构体,包含titleauthorpages三个成员变量。

2025-07-03 12:44:48 627

原创 【语法基础2】函数

定义函数时,需要指定返回类型、函数名、参数列表和函数体。

2025-06-27 10:28:32 969

原创 【语法基础1】字符串基础

本文介绍了C++中string类型的应用技巧,重点针对算法竞赛需求。内容包括:string的定义与初始化方法、常用输入方式(cin和getline)、基本操作(访问、遍历、拼接、比较、长度获取)以及实用案例解析。通过字符串去空格、单词替换、倒排单词、最大跨距等典型例题,展示了不同解题思路。文章强调在算法学习中应注重基础字符串操作的理解和实践,建议少用封装函数,多用手动实现以加深理解。适合有一定C++基础的算法学习者阅读。

2025-06-19 20:42:55 699

空空如也

空空如也

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

TA关注的人

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