跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言java算法

算法基础:双指针法处理数组分块问题

双指针算法常用于处理数组分区及顺序维护问题。针对移动零需求,通过快慢指针将数组划分为已处理非零区与未处理区,遍历时将非零元素依次前移并保持相对顺序,剩余位置自动补零。该方案支持原地修改,时间复杂度 O(n),空间复杂度 O(1)。

山野来信发布于 2026/2/6更新于 2026/10/2693 浏览
算法基础:双指针法处理数组分块问题

双指针算法与数组分块

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

约束条件

  • 必须在原数组上操作(不复制数组)。
  • 尽量减少操作次数。
  • 保持非零元素的相对顺序。

核心思路

本题属于典型的数组分块题型。所谓数组分块,即根据特定规则将数组划分为不同的区间,并通过维护这些区间的特征来解决问题。对于此类问题,双指针算法是最优解之一。

双指针中的'指针'指的是数组下标。我们可以利用两个指针将数组划分为三个逻辑区域:

  1. 已处理非零区:存放已确认的非零元素,保持原有相对顺序。
  2. 已处理零区:存放已确认的零元素(通常位于非零区之后)。
  3. 未处理区:尚未遍历的元素。

具体实现时,定义两个指针:

  • dest:指向下一个非零元素应该放置的位置。
  • cur:当前遍历到的元素索引。

算法流程

  1. 初始化 dest = -1,cur = 0。
  2. 遍历数组,当 cur 遇到非零元素时:
    • dest 自增 1。
    • 交换 nums[dest] 和 nums[cur]。
    • cur 继续向后移动。
  3. 若 cur 遇到零元素,直接跳过,因为零元素会被留在后面自然形成零块。
  4. 遍历结束后,所有非零元素已按序排列在前部,剩余部分自动为零。

代码实现

public class Solution {
    public void moveZeroes(int[] nums) {
        int dest = -1; // 指向已处理非零区的最后一个位置
        int cur = 0;   // 当前遍历指针
        
        while (cur < nums.length) {
            if (nums[cur] != 0) {
                dest++;
                
                   nums[dest];
                nums[dest] = nums[cur];
                nums[cur] = temp;
            }
            cur++;
        }
    }
}
// 交换非零元素到指定位置
int
temp
=

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组长度。只需遍历一次数组。
  • 空间复杂度:O(1),仅使用了常数个额外变量。

目录

  1. 双指针算法与数组分块
  2. 题目描述
  3. 约束条件
  4. 核心思路
  5. 算法流程
  6. 代码实现
  7. 复杂度分析

更多推荐文章

查看全部
  • 知识图谱基础概念详解:实体、关系与属性构建指南
  • HAProxy 负载均衡基础与配置示例
  • 大模型核心面试问题与解析:100 道高频考点梳理
  • 前端大数据导出优化:解决 Chrome 内存崩溃的实战方案
  • OpenClaw 完全指南:开源 AI 助手部署与配置
  • ToClaw:不只是炫技 AI,更是易用的桌面工具
  • 微软 Excel 集成 Python 功能详解:从数据分析到机器学习
  • Python 网络爬虫技术详解:原理、实战与最佳实践
  • Java 时间类(上):JDK7 及以前 Date、SimpleDateFormat、Calendar 详解
  • RAGFlow 深度文档理解:私有化 RAG 引擎实战
  • Python NumPy 核心概念与实战应用
  • Ubuntu 系统部署 FastDFS 分布式文件系统指南
  • 线程池单例模式、线程安全与重入及死锁问题解析
  • 强化学习基础:动态规划算法原理与实现
  • Java volatile 关键字深度解析:机制、场景与避坑指南
  • Trae AI IDE 实战:使用 Trae 开发 AI Chatbot 应用
  • 云开发 Copilot:AI 驱动的低代码开发实践
  • 入门安全:如何挖掘到第一个漏洞
  • 数据结构初阶详解线性表之队列
  • 基于Python+OpenCV实现自动扫雷

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online