双指针在数组遍历中的应用

算法是计算机软件的基础,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去。

一、前言

数组是最基础的数据结构之一,数组遍历是基本功,本文目的是深入学习双指针法来对数组遍历以及双指针遍历数组算法的实战。

二、双指针介绍

我们一般遍历数组使用一个下标从前往后遍历就可以实现遍历完数组,这整个过程只需要一个下标

那么双指针是怎么样呢? 其实就是使用两个下标对数组进行遍历。

为什么需要双指针呢? 主要为了弥补一些通过单指针遍历数组解决不了的场景。

比如原地移除数组元素。 下面例子需要原地移除元素里的9,通过双指针可以解决,快指针遍历数组元素值,慢指针记录需要留下的元素。但是单指针解决就麻烦。

再比如反转字符串,我们可以通过首尾双指针,通过两个指针同时往中间遍历,交换元素值实现反转功能。

因此双指针有两种类型,一种是前后双指针也可以叫做快慢双指针,一种是首尾双指针

快慢双指针用来从前往后遍历数组。

首尾双指针用来由两端往中间遍历数组。

三、双指针实战

罗列下部分可以通过双指针解决的leetcode题目:

27. 移除元素

344. 反转字符串

151.翻转字符串里的单词

第15题. 三数之和

977.有序数组的平方

本文分析下有序数组的平方

我们可以借助首尾双指针解决此题,因为平方后的数一定在两端。这样我们可以遍历最大,次最大,次次最大,最后是平方值最小的。以此类推。

java 复制代码
class Solution {
    public int[] sortedSquares(int[] nums) {

        int start = 0; //首指针
        int end = nums.length-1; //尾指针

        int[] result = new int[nums.length];
        int index = nums.length - 1;

        while(start <= end) {
            if(nums[start] * nums[start] > nums[end] * nums[end]) {
                result[index--] = nums[start] * nums[start];
                start++;
            } else {
                result[index--] = nums[end] * nums[end];
                end--;
            }
        }

        return result;

    }
}

四、总结

本文主要分析了有两种双指针形态,首尾指针快慢指针。双指针遍历数组可以提高遍历数组算法性能提升。

把双指针算法常见形态和场景记录下来,我相信有输入就需要有输出,希望对以后的编码有帮助。

关注我一起学习算法技巧吧。

相关推荐
65岁退休Coder2 分钟前
LangChain v1.3.4 笔记 - 03 Agent 的 model、tools、response_format 及 stream 输出
后端
饼干哥哥6 分钟前
n8n 又活了?用 Codex把跨境电商工作流转成 Skill
人工智能·后端·代码规范
LJHclasstore_luo7 分钟前
【C++题解】112354.平行时空
数据结构·c++·算法
武子康9 分钟前
Java 后端 → 实时语音 AI 转型复盘:4 个 FDE 技术底座 + 6 个差距 + 6 类职业资产路线
人工智能·后端·openai
霸道流氓气质34 分钟前
SpringBoot+Vue通过ModbusTCP协议实现PLC 设备连接、重连实时控制
vue.js·spring boot·后端
SimonKing39 分钟前
阿里要求全员卸载 Claude Code:事件始末与深层逻辑
java·后端·程序员
武子康1 小时前
FDE 到底是什么:为什么 AI 时代重新需要前线部署工程师(4 个标准 + 8 类风险 + 10 个问题)
人工智能·后端·openai
xianjixiance_1 小时前
鸿蒙原生开发手记:徒步迹 - 轨迹记录:暂停/继续/停止
后端
猫猫不是喵喵.1 小时前
SpringBoot自动装配原理
java·spring boot·后端
用户713874229001 小时前
Claude Code Skills 深度解析:参数传递与上下文预注入
后端