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

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

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu