【算法复习】数组与双指针篇

一、快慢指针(同向指针)

1. 核心概念

两个指针 fastslow 从同一侧(通常是索引 0)出发。

  • 快指针 fast 像侦察兵,负责在前面遍历整个数组,寻找符合「保留」条件的元素。
  • 慢指针 slow 像后勤兵,停在需要被替换的位置,只在接收到快指针传来的有效数据时才往前走。

2. 关键词

  • 「原地」修改 / 删除 / 去重
  • 「移动特定元素到末尾」(如移动 0)
  • 核心诉求:需要在 O(n)O(n)O(n) 时间复杂度和 O(1)O(1)O(1) 空间复杂度下完成数组元素的重排。

3. 代码模板

jsx 复制代码
// 适用场景:把所有符合条件的元素移到前面
let slow = 0;
for (let fast = 0; fast < nums.length; fast++) {
    if (/* nums[fast] 是我们需要保留的元素 */) {
        // 1. 赋值或交换
        nums[slow] = nums[fast];
        // 2. 慢指针前进一步,准备接收下一个
        slow++;
    }
}
// 循环结束后,slow 的值通常就是处理后新数组的长度

练习题目: LeetCode 27(移除元素)、LeetCode 283(移动零)

二、左右指针(对撞指针)

1. 核心概念

两个指针从数组的两端出发,left 在头,right 在尾,相向而行,直到相遇或交错。

2. 关键词

  • 「有序数组」+「两数之和 / 查找」(这是最强烈的信号)
  • 「反转字符串 / 数组」
  • 「回文判断」

3. 代码模板

jsx 复制代码
let left = 0;
let right = nums.length - 1;

while (left < right) {
    let sum = nums[left] + nums[right];

    if (sum === target) {
        return [left, right]; // 找到目标,直接返回或记录
    } else if (sum < target) {
        // 和太小,需要更大的数,左指针右移
        left++;
    } else {
        // 和太大,需要更小的数,右指针左移
        right--;
    }
}

练习题目: LeetCode 344(反转字符串)、LeetCode 167(两数之和 II)

相关推荐
meilindehuzi_a3 小时前
从零理解并实现 RAG:用 LangChain.js 构建语义检索问答系统
开发语言·javascript·langchain
:-)4 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
鱼樱前端4 小时前
别再自己拼凑了!这款 Vue 3.5+ 严肃产品级组件库,把 AI 对话、工作流和复杂数据全包了!
javascript·vue.js·github
Listen·Rain5 小时前
Vue3:setup详解
前端·javascript·vue.js
kyriewen6 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
小粉粉hhh7 小时前
React(二)——dom、组件间通信、useEffect
前端·javascript·react.js
Jerry8 小时前
LeetCode 101. 对称二叉树
算法
索西引擎8 小时前
【React】key 属性:协调算法中的元素标识机制与最佳实践
前端·javascript·react.js
可编程芯片开发9 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星9 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学