双指针
文章平均质量分 94
双指针的概念以及LeetCode的相关题目。
伟大的车尔尼
走自己的路,让别人去说吧!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
双指针题目:K 和数对的最大数目
由于每一步操作必须移除数组中的两个整数,不能将同一个整数移除两次(移除的两个整数可以相等但是下标必须不同),因此为了避免在。空间复杂度主要取决于哈希表,哈希表中的元素个数不超过。将数组排序之后,可以使用双指针计算数组中的元素之和等于。遍历数组一次,每个元素的计算时间都是常数。的时间,使用双指针遍历数组计算最大操作数需要。时,两个指针指向同一个元素,因此不存在两个。,结束上述操作,此时即可得到最大操作数。的大小关系,调整指针指向的下标。的元素对数目,即最大操作数。,这两个元素都被移除,因此将。原创 2025-12-31 18:00:00 · 1341 阅读 · 0 评论 -
双指针题目:盛最多水的容器
为了使容器可以容纳的水量最大化,应使新容器的高度可能比原容器的高度增加。当选定两条垂线以后,容器可以容纳的水量等于容器的宽度与高度的乘积,宽度等于两条垂线的下标差,高度等于两条垂线中较短的垂线的长度。向左移动皆可,移动任何一个下标之后,新容器的高度一定不超过原容器的高度,因此新容器可以容纳的水量一定减少。向右移动之后,对于任何一个排除的下标对,其所对应的容器可以容纳的水量一定不是最大水量。向左移动之后,对于任何一个排除的下标对,其所对应的容器可以容纳的水量一定不是最大水量。原创 2025-12-29 08:00:00 · 616 阅读 · 0 评论 -
双指针题目:判断子序列
动态规划是求解决策过程最优化的过程,其核心思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。动态规划适用于存在重叠子问题的情况,当一个子问题被解决时,将该子问题的答案记录在表格中,下次遇到相同子问题时不需要重复计算,而是可以直接从表格中得到该子问题的答案,从而实现降低时间复杂度的目的。首先需要定义状态的含义,然后直接得到边界情况中的每个状态的结果,最后使用状态转移方程计算所有状态的结果。中的尚未匹配的字符中的最近相同字符匹配,该做法是最优的,理由如下。原创 2025-12-25 18:00:00 · 1476 阅读 · 0 评论 -
双指针题目:两数之和 IV - 输入二叉搜索树
解法三虽然利用了二叉搜索树的性质,但是做法是首先得到中序遍历序列,然后在中序遍历序列上使用双指针的做法判断是否存在两个结点的结点值之和等于目标值,中序遍历序列需要。分别为二叉搜索树中的最左侧结点和最右侧结点,可以模拟正向中序遍历操作和反向中序遍历操作,使用双指针判断是否存在两个结点的结点值之和等于目标值。得到二叉搜索树的中序遍历序列之后,可以使用二分查找或双指针的做法判断是否存在两个结点的结点值之和等于目标值,其中双指针的做法时间复杂度更低。利用二叉搜索树的性质,可以使用二叉搜索树的中序遍历寻找结点值。原创 2025-12-22 18:00:00 · 619 阅读 · 0 评论 -
双指针题目:两个数组的交集 II
分别在两个数组的下标范围中时,重复上述操作,直到至少有一个下标超出数组的下标范围,此时不存在更多的同时在两个数组中出现的元素,可以得到交集的全部元素。实现方面,为了降低空间复杂度,可以首先遍历较短的数组并使用哈希表记录较短的数组中每个元素的出现次数,然后遍历较长的数组计算交集。首先将两个数组升序排序,排序之后的数组满足相等的元素在数组中的相邻位置,因此可以计算每个元素在两个数组中同时出现的次数。,返回两个数组的交集。,则当前元素在两个数组中都出现,因此在两个数组的交集内,将当前元素添加到结果中,将。原创 2025-12-18 18:00:00 · 1422 阅读 · 0 评论 -
双指针题目:两个数组的交集
得到两个哈希集合之后,遍历其中任意一个哈希集合,判断其中的每个元素是否在另一个哈希集合中出现,如果一个元素在两个哈希集合中都出现,则该元素在两个数组的交集内,将该元素添加到结果数组中。两个数组的交集为在两个数组中都出现的元素集合。由于结果中的每个元素只出现一次,因此不需要考虑每个元素在两个数组中的出现次数,只需要考虑在两个数组中都出现的元素。分别在两个数组的下标范围中时,重复上述操作,直到至少有一个下标超出数组的下标范围,此时不存在更多的同时在两个数组中出现的元素,可以得到交集的全部元素。原创 2025-12-15 18:00:00 · 867 阅读 · 0 评论 -
双指针题目:移动零
的元素移动到数组的末尾,将非零元素移动到数组的前面,同时保持非零元素的相对顺序不变,可以使用双指针实现。交换,则慢指针不需要遍历整个数组,该思路可以减少操作次数。则交换两个指针处的元素,否则跳过当前元素,具体做法如下。移动到数组的末尾,同时保持非零元素的相对顺序不变。则填入结果数组,否则跳过当前元素,具体做法如下。中的所有非零元素都是非零元素时,其余元素都是。中的元素是所有非零元素且相对顺序不变,此时。的元素填入数组,初始时两个指针都指向下标。的元素填入数组,初始时两个指针都指向下标。原创 2025-12-11 18:00:00 · 883 阅读 · 0 评论 -
双指针题目:移除元素
解法一可以使用快慢指针从左到右遍历数组,结果数组中的元素与原数组中的元素的相对顺序相同。由于结果数组中的元素顺序可以改变,因此也可以使用反向双指针,其主要思想是将结果数组中的等于。的元素,并将其余元素填入结果数组,可以使用双指针实现。则填入结果数组,否则跳过当前元素,具体做法如下。的元素填入结果数组,初始时两个指针都指向下标。时,存在尚未处理的元素,因此重复上述操作。的元素填到结果数组外的部分,初始时。,则删除当前元素,因此跳过当前元素。的元素后的所有元素,结果数组有。的元素后的所有元素,结果数组有。原创 2025-12-08 18:00:00 · 881 阅读 · 0 评论 -
双指针题目:删除有序数组中的重复项
由于数组已经排序,因此重复的元素一定在数组中的相邻位置。对于每个元素,将其与前一个元素比较,如果该元素和前一个元素重复,则该元素不保留。快指针遍历数组的过程中,需要判断当前元素是否为重复元素,如果不是重复元素则填入结果数组,否则跳过当前元素,具体做法如下。,快指针用于遍历数组,慢指针用于将不同元素填入结果数组,初始时两个指针都指向下标。删除重复元素并将不同元素填入结果数组,可以使用双指针实现。的元素为数组中删除重复项后的所有元素,结果数组有。,则当前元素与上一个元素相同,因此跳过当前元素。原创 2025-12-04 18:00:00 · 821 阅读 · 0 评论 -
双指针题目:两数之和 II - 输入有序数组
在长度为nnn的数组中寻找元素之和等于目标值的两个元素下标,最简单的做法是使用两层循环遍历数组,时间复杂度是On2O(n^2)On2,空间复杂度是O1O(1)O1。由于这道题中给定的数组已经按升序排序,因此在不增加空间复杂度的前提下可以使用时间复杂度更低的解法,可能的解法包括时间复杂度OnlognOnlogn的二分查找以及时间复杂度OnO(n)On的双指针。原创 2025-12-01 18:00:00 · 545 阅读 · 0 评论 -
双指针题目:验证回文串 II
在不删除字符的情况下,判断字符串是不是回文串的做法是使用双指针从字符串的两端开始同时向中间移动,直到两个指针相遇。如果移动过程中出现两个指针指向的字符不同,则字符串不满足正向和反向遍历的结果相同,因此不是回文串。如果移动过程中,两个指针指向的字符总是相同,则字符串是回文串。分别检查这两个下标范围中的子串是不是回文串,如果其中至少有一个子串是回文串,则可以通过删除一个字符将。在允许删除最多一个字符的情况下,如果移动过程中出现。变成回文串,否则不可以通过删除一个字符将。是回文串,不需要删除任何字符。原创 2025-11-27 18:00:00 · 692 阅读 · 0 评论 -
双指针题目:验证回文串
首先考虑一个简单的问题:如果考虑字符串中的所有字符且区分大小写,如何判断字符串是不是回文串。如果移动过程中出现两个指针指向的字符不同,则字符串不满足正向和反向遍历的结果相同,因此不是回文串。如果移动过程中,两个指针指向的字符总是相同,则字符串是回文串。这道题增加了两个条件,一是不区分大小写,二是只考虑字母和数字,因此使用双指针的过程中需要做相应的处理。如果将一个字符串中的所有大写字母转成小写字母并移除所有非字母和数字的字符之后,正向和反向遍历的结果相同,则该字符串是。解释:在移除非字母和数字的字符之后,原创 2025-11-24 18:00:00 · 1112 阅读 · 0 评论 -
双指针题目:仅仅反转字母
反转字符串可以使用双指针实现,两个指针分别从字符串的两端向中间移动,移动过程中完成反转。由于只反转字母,其他字符都不反转,因此双指针遍历的过程中需要跳过非字母的字符。,则当前下标的左边和右边的字母都已经反转,无论当前下标的字符是否为字母,整个字符串的字母都已经反转。需要遍历字符串中的每个字符一次,每次判断字符是否为字母以及交换操作的时间是。类型的数组,在数组中完成字母的反转,反转结束之后,将数组创建字符串对象并返回。类型的对象是不可变的,因此需要对字符串调用。右侧的字母已经反转,因此将。原创 2025-11-20 18:00:00 · 648 阅读 · 0 评论 -
双指针题目:反转字符串中的元音字母
反转字符串可以使用双指针实现,两个指针分别从字符串的两端向中间移动,移动过程中完成反转。由于只反转元音字母,其他字符都不反转,因此双指针遍历的过程中需要跳过非元音字母的字符。,则当前下标的左边和右边的元音字母都已经反转,无论当前下标的字符是否为元音字母,整个字符串的元音字母都已经反转。需要遍历字符串中的每个字符一次,每次判断字符是否为元音字母以及交换操作的时间是。类型的数组,在数组中完成元音字母的反转,反转结束之后,将数组创建字符串对象并返回。,仅反转字符串中的所有元音字母,并返回结果字符串。原创 2025-11-17 18:00:00 · 913 阅读 · 0 评论 -
双指针题目:反转字符串中的单词 III
当遍历结束时,由于最后一个单词的右边没有空格,因此不能通过空格定位最后一个单词的结束位置,最后一个单词的结束位置是整个字符串的结束位置,需要将最后一个单词反转。为了将字符串中的每个单词反转,需要定位到每个单词的下标区间,然后对下标区间中的字符反转。类型的数组,在数组中完成每个单词的反转,反转结束之后,将数组创建字符串对象并返回。,反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。处的字符是空格,则上一个单词的结束位置是下标。,将上一个单词反转之后,下一个单词的起始位置是。原创 2025-11-13 18:00:00 · 570 阅读 · 0 评论 -
双指针题目:反转字符串 II
类型的数组,在数组中完成反转字符串,反转结束之后,将数组创建字符串对象并返回。,则将剩余字符全部反转。类型的对象是不可变的,因此需要对字符串调用。表示当前子串中的最后一个待反转的字符,则。个字符反转,如果最后一个子串的长度小于。类型的对象不可变,因此空间复杂度至少为。的子串,最后一个子串的长度可能小于。需要遍历字符串一次。则将最后一个子串的全部字符反转。表示每个子串的开始下标,初始时。的字符交换,即可完成反转字符串。,从字符串的起始位置开始,每。,如果最后一个子串的长度小于。个字符,其余字符保持原样。原创 2025-11-10 18:00:00 · 854 阅读 · 0 评论 -
双指针题目:按奇偶排序数组 II
最直观的做法是新建一个结果数组,将原数组中的元素依次填入结果数组,结果数组满足所有偶数元素位于偶数下标,所有奇数元素位于奇数下标。超出数组下标范围时,所有偶数都位于偶数下标,由于数组中的元素有一半是偶数,数组中的下标有一半是偶数下标,因此当所有偶数都位于偶数下标时,位于奇数下标的所有元素都是奇数,此时。是偶数,移动两个下标的过程中如果下标超出数组下标范围则停止移动下标。由于原数组中的偶数和奇数各占一半,因此遍历原数组结束之后,原数组中的所有元素都填入结果数组,且每个元素与所在下标的奇偶性都相同。原创 2025-11-06 18:00:00 · 993 阅读 · 0 评论 -
双指针题目:按奇偶排序数组
最直观的做法是新建一个结果数组,将原数组中的元素依次填入结果数组,结果数组满足所有偶数元素在前面,所有奇数元素在后面。为了确保结果数组中的所有偶数在所有奇数前面,需要分别从数组的起始位置和结束位置开始填入偶数和奇数。,则当前下标的左边的元素都是偶数,当前下标的右边的元素都是奇数,无论当前下标的元素是偶数还是奇数,整个数组都已经符合所有偶数在所有奇数前面的条件,因此返回数组。遍历原数组结束之后,原数组中的所有元素都填入结果数组。中的所有偶数元素移动到数组的前面,所有奇数元素移动到数组的后面。原创 2025-11-03 18:00:00 · 1013 阅读 · 0 评论 -
双指针题目:合并两个有序数组
这里的合并操作与归并排序的合并两个有序子数组相似。为了避免覆盖已有的元素,合并过程中需要反向遍历两个数组。之一为负时,只剩一个数组还有尚未合并的元素,将该数组中的元素依次填到。需要遍历每个元素一次,每个元素的合并操作时间是。的所有元素都已经合并,尚未合并的元素都是数组。下面的代码为同时遍历两个数组将元素复制。表示下一个待合并的元素应该填入数组。下面的代码为使用 Java 自带的。的元素个数之和,因此可以将数组。的尚未合并的元素的最大下标,用。的大小,将其中较大的元素填到。个元素表示待合并的元素,后。原创 2025-10-30 18:00:00 · 662 阅读 · 0 评论 -
双指针题目:反转字符串
输入字符串以字符数组。双指针遍历字符串一次。的字符交换,即可完成反转字符串。向左移动一位,重复该操作直到。的空间原地修改输入数组。,反转之前的字符串是。,反转之后的字符串是。,此时完成反转字符串。原创 2025-10-27 18:00:00 · 982 阅读 · 0 评论 -
双指针的概念
快慢指针可以用于数组和链表,数组的典型例子包括删除重复元素以及删除特定值的元素,链表的典型例子包括寻找链表的中点、判断链表中是否有环以及寻找链表中的环的入口。同速指针为双指针按照相同速度同时移动,指针之间的距离固定的情形。反向指针的常见做法是双指针从序列的首尾开始相向移动,直到相遇。双指针只需要考虑指针处的元素,不需要考虑指针之间的元素,且指针的移动方向可以是同向或反向。常见的同向指针包括同速指针和快慢指针。根据双指针的移动方向是否相同,双指针可以分成同向指针和反向指针两类。原创 2025-10-23 18:00:00 · 669 阅读 · 0 评论
分享