双指针算法专题之——复写零

文章目录

  • 题目介绍
  • 思路分析
    • 异地复写
    • 优化为就地复写
  • AC代码

题目介绍

链接: 1089. 复写零

在这里插入图片描述

思路分析

那么这道题我们依然可以使用双指针算法来解决

异地复写

先不考虑题目的要求,直接就地在原数组上修改,可能不太好想,我们这里可以先在一个新开的数组上进行复写

起始双指针分别指向两个数组0下标在这里插入图片描述
如果cur指向的元素是非0,dest只把cur的值拷贝下来,无需复写(只有0才复写),然后两者都++
在这里插入图片描述
cur如果指向0,那dest要拷贝两次(复写一次),然后两者都++
在这里插入图片描述
后续也是如此
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实很简单,就是模拟题目要求的复写操作,非0不动,0复写
对比一下题目的例子,结果是正确的
在这里插入图片描述

优化为就地复写

那接下来我们就要尝试在上面的基础上进行优化,优化为原地复写
怎么做呢?现在就只能在原数组上就地操作了

我们来尝试一下:

在这里插入图片描述
上来cur指向非0
无需任何操作,两者++即可,刚才我们要拷贝是因为dest指向一个新数组,现在都指向原数组
在这里插入图片描述
然后cur是0,所以要复写一次0
在这里插入图片描述
那就变成这样了。
这样其实已经不行了,因为2被复写的0覆盖掉了,而cur++之后又指向了刚刚复写的0,这样后面都是0了,肯定的不对的

所以这道题从前向后移动指针是不行的,那我们可以反过来看看!

从后向前呢?
在这里插入图片描述
那两个指针都指向最后一个元素吗?
🆗,dest呢从最后一个位置开始,而cur,我们让它一开始指向最后一个被处理的数。
因为最后一个被处理的数处理完毕一定是在数组最后一个位置的。
怎么找最后一个处理的数我们后面说,但是对于当前这个例子,我们知道最后一个处理的数,就是4
在这里插入图片描述
然后,就让它们从后往前移动,进行像上面异地复写一样的操作就行了
在这里插入图片描述
答案正确!

总结一下:

先找到最后一个被处理的数,然后从后往前进行复写即可

那现在关键问题在于,对于任意一个数组,我们如何找到它最后一个处理的元素是谁?

那么这个问题也可以使用双指针来解决!
怎么做呢?
依然用上面这个例子
在这里插入图片描述
让cur从0开始,dest从-1开始,然后,其实就是去模拟整个复写的过程。
如果cur指向的是非0,让dest走一步(只拷贝,不复写),然后cur++;
如果是0,则dest走两步(拷贝+复写),然后cur++
当dest走到最后一个位置时候,就结束了,再走就越界了,此时,cur指向的元素就是最后一个被处理的数。
这个我就不再画图了,大家如果不理解可以自己画一下图走一遍。

但是,还有一种情况需要考虑:

在这里插入图片描述
如果最后一个被处理的数是0,这时dest往后走两步有可能出现越界的情况。
所以,针对这种情况,我们可以处理一下:
此时0就是最后一个被处理的数,cur从0开始倒着处理,那此时dest应该拷贝+复写,然后两者都- -
但是此时dest是越界的,即执行拷贝的位置是越界的,所以cur直接- -,然后复写一个0,然后两者都- -。
即把n-1下标置0,cur- -,dest-=2。
后续正常处理就行。

AC代码

上面分析的比较清楚了,代码就不过多解释了
在这里插入图片描述
在这里插入图片描述

class Solution {
public:void duplicateZeros(vector<int>& arr) {int n = arr.size();// 1.先找到最后一个被处理的元素int cur = 0;int dest = -1;while (dest < n - 1) {if (arr[cur] != 0)dest++;elsedest += 2;if (dest >= n - 1)break; // 如果dest>=n-1(走到最后一个位置或者越界的情况),// 此时cur就是最后一个被处理的元素,不能再++了,直接breakcur++;}// 2.处理一下dest越界的情况if (dest == n) {arr[n - 1] = 0;cur--;dest -= 2;}// 3.从后往前进行复写while (dest >= 0) {if (arr[cur] != 0)arr[dest] = arr[cur];else {arr[dest] = 0;arr[--dest] = 0;}cur--;dest--;}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python控制语句 ——break和continue

1.以下关于Python循环结构的描述中,错误的是() 。 A、break用来结束当前当次语句,但不跳出当前的循环体。 B、遍历循环中的遍历结构可以是字符串、文件、组合数据类型和range函数等。 C、Python通过for,while等保留字构建循环结构。 D、continue只结束本次循环。 答案:A。在…

搭建阿里云专有网络VPC

目录 一、概述 二、专有网络vpc 2.1 vpc基本信息 2.2 vpc资源管理 2.3 vpc网段管理 三、交换机 四、NAT网关 4.1 绑定弹性公网IP 4.2 NAT网关信息 4.3 绑定的弹性公网IP 4.4 DNAT 4.5 SNAT 五、弹性公网IP 六、访问控制ACL&#xff08;绑定交换机&#xff09; 6…

阿里巴巴发布 R1-Omni:首个基于 RLVR 的全模态大语言模型,用于情感识别

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》

在游戏开发领域&#xff0c;鸿蒙系统的崛起为开发者们带来了前所未有的机遇与挑战。尤其是在开发基于鸿蒙系统的人工智能游戏时&#xff0c;实现智能NPC的行为逻辑与游戏剧情紧密结合&#xff0c;成为了打造沉浸式游戏体验的关键。 鸿蒙系统作为一款面向全场景的分布式操作系统…

聚划算!三个模型对比预测!CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测

聚划算&#xff01;三个模型对比预测&#xff01;CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测 目录 聚划算&#xff01;三个模型对比预测&#xff01;CNN-GRU、GRU、CNN三模型多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 CNN-GRU、GRU、CN…

C# 的 ManualResetEvent(线程同步操作) 类详解

C# 的 ManualResetEvent 类详解 作用 ManualResetEvent 是用于线程同步操作的类&#xff0c;允许一个或多个线程等待特定信号&#xff0c;以协调多个线程的执行顺序。它通过事件通知机制实现&#xff0c;确保线程在收到信号前保持阻塞&#xff0c;直到其他线程显式发出信号。…

小白学习:提示工程(什么是prompt)

课程链接 https://www.bilibili.com/video/BV1PX9iYQEry/?spm_id_from333.337.search-card.all.click 一 什么是提示工程 【提示工程】也叫【指令工程】 prompt就是给大模型发的指令&#xff0c;如“给我讲个笑话” 懂得提示工程原理会带来什么优势 懂得原理 为什么有的指…

Docker Compose 之详解(Detailed Explanation of Docker Compose)

Docker Compose 之详解 当容器数量逐渐增多&#xff0c;你是否感到手忙脚乱&#xff1f;面对复杂的部署场景&#xff0c;是时候祭出神器Docker Compose了&#xff01;它能帮你优雅地管理多容器应用&#xff0c;一键启动、停止所有服务&#xff0c;不再为复杂的手动操作焦头烂额…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)

目录 1. 内存和地址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用操作符 &#xff08;*&#xff09; 3. 指针的解引用 3.1 指针 - 整数 3.2 void* 指针 4. const修饰指针 4.1 const修饰变量 4.2 const修饰指针变量 5…

【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目

【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目 在Azure Web应用上,您可以使用Python的OpenAI包方便快捷地调用官方API,上传您的训练数据,并利用他们的算法进行处理。本教程提供了一个逐步指南,帮助您在Azure Web应用上部署您的OpenAI项目,涵盖了从资源设置到…

机器视觉工程师红外相机的选择:红外长波工业相机和短波红外工业相机玄机大总结

红外长波(LWIR)和短波(SWIR)工业相机在原理、应用场景和技术特点上有显著差异。以下是它们的对比分析: 1. 波长范围与成像原理 2. 技术特点 3. 典型应用场景 4. 优缺点对比 LWIR优势: 无需光照,适用于完全黑暗环境。 直接反映物体温度分布。 对烟雾、灰尘穿透能力强。…

uni-app学习笔记——自定义模板

一、流程 1.这是一个硬性的流程&#xff0c;只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面&#xff0c;都如第二步一样&#xff1b;可以选择自定义的模版&#xff08;vue3Setup——这是我自己的模版&#xff09;&#xff0c;第二步的…

DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了&#xff0c;虽然经过扩容和调整&#xff0c;但反应依旧不稳定&#xff0c;甚至小圆圈转半天最后却提示“服务器繁忙&#xff0c;请稍后再试。” 故此&#xff0c;本文通过讲解在本地部署 DeepSeek并配合python代码实现&#xff0c;让你零成本搭建自己的AI…

Vue3计算属性深度解析:经典场景与Vue2对比

一、计算属性的核心价值 计算属性&#xff08;Computed Properties&#xff09;是Vue响应式系统的核心特性之一&#xff0c;它通过依赖追踪和缓存机制优雅地解决模板中复杂逻辑的问题。当我们需要基于现有响应式数据进行派生计算时&#xff0c;计算属性总能保持高效的性能表现…

python-leetcode-删除链表的倒数第 N 个结点

LCR 021. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 可以使用双指针方法来解决这个问题&#xff0c;这样可以在一次遍历内完成删除操作&#xff0c;从而达到 O(n) 的时间复杂度。以下是 Python 代码实现&#xff1a; 解题思路&#xff1a; 初始化快…

vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy

首先用 express 搭建后端服务器&#xff0c;注意使用中间件解析json格式的请求体&#xff0c;才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …

Linux:基本指令与内涵理解

1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式&#xff1a;ls (选项) (查看层级&#xff09; 其中选项处不写就默认是显示文件名&#xff0c;查看层级默认是当前层级 选项1&#xff1a; -l 作用&#xff1a;将查找文件的详细信息显示出来 我们…

SpaceSync智能排班:重构未来办公空间的神经中枢

文心智能体平台可免费使用DeepSeek 满血版啦&#xff0c;使用DeepSeek模型创建并提交智能体&#xff0c;即有机会瓜分万元奖金&#xff01;有这等好事还不快冲&#xff01; 文心智能体官网&#xff1a;文心智能体平台AgentBuilder | 想象即现实 本片文章为作者参加文心智能体平…

flutter dio库 源码赏析

1. factory函数 //调用factory构造方法后&#xff0c;实际返回的是Dio的子类 Dio dio Dio();abstract class Dio {factory Dio([BaseOptions? options]) > createDio(options); } 2. CancelToken 作用:取消操作 CancelToken cancelToken CancelToken();//监听取消 ca…

RGV调度算法

1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…