【双指针算法】原地处理数组的双指针算法思想

2024-06-10 08:04

本文主要是介绍【双指针算法】原地处理数组的双指针算法思想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

移动零

5992587c62f74754b2090e2495778db1.png

题目中已经明确表示不能重新创建数组来辅助解题,因此只能对数组进行原地操作,即双指针算法思想。

算法思想:

题目要求我们将非0元素放在数组的左边,0元素放在数组的右边,同时保持非0元素的相对位置。

这种对数组元素进行分类的题目一般用双指针比较合适。

注意:这里的双指针其实指的是数组元素的索引。

首先我们将待处理数组分为三部分区间:非0区间:[0,dest]      0区间:[dest+1,cur-1]     待处理区间:[cur,n-1] 

cur:用于遍历数组遇到非0元素则停止。dest:用于交换非0元素与0元素。

1、cur = 0, dest = -1

2、cur遇到0元素:++cur

      cur遇到非0元素:swap(a[dest+1], a[cur]),然后++dest,++cur

      当cur>n-1则结束。

1925a07b4d024da4a91876d08b2f7345.png

e93b9b5a307141a99a23a58c8510bc88.png

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur = 0, dest = -1;cur < nums.size();cur++){if(nums[cur])swap(nums[cur], nums[++dest]);}}
};

复写零

e3ef473a94cb4530a05b5b218cfde24e.png

 这道题目要求也是就地进行数组操作,使用双指针是合适的。

算法思想:

先根据“异地”操作然后优化成“就地”操作。下图是通过异地操作获取最后一个“复写”的数。

1、dest = -1,cur = 0,判断a[cur]的值

2、判断dest是否越界 dest <= n-1

3、a[cur] == 0则dest += 2    a[cur] != 0则dest++

4、cur++

a69219f9a462436fa565f67b6896fa6e.png

但是这里有一种特殊情况:

9a2dbc180a884a2aa793ae9d0720ea04.png

找到最后一个复写的元素后按照”从后往前“(因为刚开始从前往后的话,会将后面的元素覆盖掉)的顺序对待处理数组进行复写操作。

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0, dest = -1;int n = arr.size();//先找到最后一个复写的数while( cur < n){if(arr[cur])++dest;elsedest += 2;if(dest >= n-1)break;++cur;}//处理边界情况if(dest == n){arr[n-1] = 0;--cur;dest -= 2;}//最后从后往前复写元素获得所求数组while(cur >= 0){if(arr[cur])arr[dest--] = arr[cur--];else{arr[dest--] = arr[cur];arr[dest--] = arr[cur--];}}}
};

这篇关于【双指针算法】原地处理数组的双指针算法思想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047602

相关文章

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序