96SEO 2026-08-06 09:51 9
大家好,我是程序员牛奶,这篇文章讲解的内容是双指针技巧的相关习题。读完这篇文章可以去解决以下题目:
| 网站 | 题目 | 难度 |
|---|---|---|
| LeetCode | Remove Duplicates from Sorted Array 26. 删除有序数组中的重复项🟢 | Easy |
| LeetCode | Remove Duplicates from Sorted List 83. 删除排序链表中的重复元素🟢 | Easy |
| LeetCode | Remove Element 27. 移除元素🟢 | Easy |
| LeetCode | Move Zeroes 283. 移动零🟢 | Easy |
| LeetCode | Two Sum II - Input Array Is Sorted 167. 两数之和 II - 输入有序数组🟡 | Medium |
| LeetCode | ||
| LeetCode | Longest Palindromic Substring 5. 最长回文子串🟡 | Medium |
阅读这篇文章前,你需要先学习我的单链表双指针相关的算法内容。

在处理数组和链表相关问题时双指针技巧是经常用到的,主要分为两类:
对于单链表大部分技巧都属于快慢指针,比如链表环判断、倒数第 K 个节点等。在数组中没有真实的指针,但可以把索引当做指针,一样施展双指针技巧。这篇文章主要讲数组相关的双指针算法。怎么说呢,
痛点: 很多同学在面对「原地删除」或「原地修改」时会直接使用额外数组或频繁的.remove导致 O 的时间复杂度。下面的模板帮助你一次遍历搞定。
int slow = 0,fast = 0;while {
if {
nums = nums;slow++,}
fast++;}
// slow 即为结果长度
从主要思想来看。fast 负责探路遍历整个数组,slow 负责维护结果边界。只有满足条件时才把元素「收录」到slow 位置,从而避免不必要的数据搬移。
Pain point: 如果每发现一个重复就立刻使用.remove会导致 O 的时间开销。
利用快慢指针,只需要一次遍历就可以完成去重:
class Solution {
public int removeDuplicates {
if return 0;int slow = 0,fast = 1;老实说,while {
if {
slow++;// 先移动到下一个空位
nums = nums;// 再写入新值
}
fast++;}
return slow + 1;// 索引 +1 才是长度
}
}
Pain point: 不少人对链表去重仍然坚持创建新链表,浪费空间。实际只需要改动指针即可,
class Solution {
public ListNode deleteDuplicates {
if return null;ListNode slow = head,fast = head;while {
if {
slow.next = fast;// 把新节点接到结果链表尾部
slow = slow.next;}
fast = fast.next;}
slow.next = null;// 防止残留旧节点
return head;怎么说呢,}
}
Pain point: 很多人误以为必须先找出所有要删除的下标再统一处理。只要一次遍历即可,
class Solution {
public int removeElement {
int fast = 0,slow = 0;while {
if { // 非目标值才保留
nums = nums;slow++,}
fast++;}
return slow;// 新长度
}
}
Pain point: 不少同学会写两次循环:一次搬非零,一次填零。其实可以复用上面的#removeElement框架,让代码更简洁。
class Solution {
public void moveZeroes {
// 第一步先:把所有非零元素搬到左侧,返回新长度 p
int p = removeElement;// 接下来:把剩余位置全部填充为零
for {
nums = 0;}
}
private int removeElement {
int fast = 0,slow = 0;怎么说呢,while {
if {
nums = nums;}
fast++,}
return slow;话说回来,}
}
If you need to handle “子数组/子串 + 条件约束”。滑动窗口提供了一个天然的快慢指针框架。感兴趣的同学可参考我的《滑动窗口算法主要框架详解》章节。
Pain point: 面对有序数组求和、配对等问题时很多人第一反应是二重循环 O。只需要左右两端各一根指针即可线性完成。
int left = 0,right = nums.length - 1;其实,while {
if { return ...;}
else if { left++;}
else { right--;}
}
return -1;// 未找到
}
This problem perfectly illustrates left‑right technique.
class Solution {
public int twoSum {
int left = 0,right = numbers.length - 1;while {
int sum = numbers + numbers;if return new int{left + 1,right + 1};else if left++;// sum 太小,需要更大的左侧数
else right--;// sum 太大,需要更小的右侧数
}
return new int{-1,-1};}
}
The most straightforward application of left‑right pointers.
void reverseString{
int left=0,right=s.length-1;怎么说呢,while{
char tmp=s;s=s,s=tmp;left++,right--;}
}
The “中心 ”方式仍然使用左右指针。只但是它们从中心*向外*展开**而不是相向而行,这也是一种特殊的左右指针对称运动。
class Solution{
public String longestPalindrome{
String best="";for,i++){
String odd=expand;// 奇数长度中心
String even=expand;// 偶数长度中心
best=best.length>odd.length?best:odd,best=best.length>even.length?best:even,}
return best;}
private String expand{ while && s.charAt==s.charAt){ l--;r++,} return s.substring;} }
The algorithm runs in O. For interview purposes this is sufficient—if you crave O,study Manacher’s algorithm.
| 题目类型 / 场景 | 对应指针类型 | 主要判断条件 | 返回值/意义 | 常见痛点 | 快速定位思路 |
|---|---|---|---|---|---|
| `删除有序数组中的重复项` | `删除排序链表中的重复元素` | `移除元素` | `移动零` | `快慢` `slow ← result boundary` | `nums!=nums` or `nums!=val` | `new length` | `误以为要 new 数组 / O` | `套模板① → 替换判断条件即可` |
| `两数之和 II - 输入有序数组` | `左右相向` `left←start,right←end` | `sum 与 target 大小比较` | `下标 pair` | `直接暴力双循环导致 TLE` | `套模板② → 根据大小决定 left++ / right--` |
| `反转字符串` | `左右相向交换` | `left < right` | `原地翻转完成,无返回值` | `忘记同步移动两根指针导致死循环或遗漏字符 ` | `套模板② → 每次 swap 后同步 ++/-- |
| `最长回文子串` | `左右从中心 outward` | `s==s while valid` | `最长回文子串本身 ` | `不知道如何枚举奇偶中心 ` | `外层遍历每个字符 → 调用 expand |
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback