type
status
date
slug
summary
tags
category
icon
password
如何识别使用双指针技巧的题目:
- 有序数据:当题目给出的数据是有序的,或者可以通过排序变为有序的,可能会用到双指针。
- 寻找配对或者对比:需要寻找某种配对条件(例如和为特定值的两个数)或者需要对比两个位置的元素。
- 子序列或子串问题:需要找到满足条件的子序列或子串,或者需要对子序列或子串进行操作。
- 需要线性时间复杂度解决问题:当题目需要在O(n)时间内解决时,双指针是一个常见的选择。
- 空间复杂度要求较低:双指针通常可以帮助实现O(1)的空间复杂度。
- 合并、比较或者距离计算:需要合并两个有序数组,比较两个数组或字符串,或计算两个元素之间的距离。
- 双指针一般能降一个n的时间复杂度。 原来是O(n)可以降为O(1)或O(n2)降为O(n)
双指针技巧的常见应用:
- code:
1. 对撞指针:
对撞指针通常应用于有序数组或字符串,两个指针分别从头和尾开始,根据某些条件向中间移动,直至两指针相遇。
- 常见题型
- 求和问题:在数组或链表中找到两个或多个数字,使其和等于特定值。
- 回文问题:判断数组或链表中的元素是否形成一个回文。
- 排序问题:将数组或链表的元素按照某种条件重新排列。
- 双索引问题:需要使用两个指针从不同方向遍历数组或链表,并根据某些条件来解决问题。
- 解决思路:
- 初始化两个指针,一个在开始位置,一个在结束位置。
- 根据数组/字符串中的值和目标值的比较,移动指针。
- 继续上述过程,直到找到满足条件的元素,或者两指针相遇。
题目:
2. 滑动窗口:
滑动窗口主要用于处理数组/字符串的子序列或子串问题,通过两个指针维护一个窗口,并在需要时更新窗口的大小和位置。
- 常见题型:
- 最大/最小子数组或子串问题
- 固定大小的滑动窗口问题
- 可变大小的滑动窗口问题
- 字符串排列、异位词或连续子串问题
- 子数组或子串的和问题
- 解决思路:
- 初始化两个指针表示窗口的开始和结束位置。
- 根据窗口中的元素和目标值的关系,决定是移动左指针缩小窗口,还是移动右指针扩大窗口。
- 在每个窗口位置检查是否满足题目条件,并在必要时更新结果。
题目:
3. 快慢指针:
快慢指针通常应用于链表和数组中,一个指针移动速度是另一个的两倍,用于解决环、中点和倒数第k个元素等问题。
- 常见题型:
- 循环检测:检测链表或数组中是否存在循环。
- 中间值寻找:找到链表的中间节点或数组的中间元素。
- 链表重排:重新排列链表的节点。
- 寻找环的入口:在链表中寻找环的入口。
- 快慢指针的配合:解决其他需要快慢指针配合的问题。
- 解决思路:
- 初始化快指针和慢指针在同一位置。
- 快指针每次移动两步,慢指针每次移动一步。
- 如果存在环,快指针会追上慢指针;如果需要找中点或倒数第k个元素,利用快慢指针的相对速度获取位置信息。
题目:
4. 读写指针:
读写指针常用于在数组或字符串中进行原地修改,一个指针负责读取数据,另一个负责写入数据。
- 常见题型:
- 移除元素:从数组或字符串中移除指定的元素或字符。
- 数组压缩:对数组进行压缩,通常是将重复的元素移至数组的末尾。
- 数组或字符串的修改:在遍历数组或字符串的同时进行修改。
- 解决思路:
- 初始化读指针和写指针。
- 读指针遍历数组/字符串,找到需要保留的元素。
- 将保留的元素写入写指针的位置,并移动写指针。
题目:
5. 链表中的双指针:
在链表中使用双指针可以解决寻找中点、寻找环、删除倒数第k个节点等问题。
- 解决思路:
- 初始化两个指针。
- 根据题目要求,移动指针来寻找中点、检测环或找到特定的节点。
- 在链表上进行必要的操作,如删除节点、合并链表等。
- Author:Tianqi
- URL:https://notion-next-olive-five-36.vercel.app//article/979dd284-3dca-451c-a26c-94d71e4bc862
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts