(2)双指针练习:复写零

复写零

题目链接:1089. 复写零 - 力扣(LeetCode)

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

思路解析:

本题有两种思路:

  1. 暴力复写
  2. 双指针原地复写
  • 暴力复写

暴力的方法很简单,因为是复写,所以只需要遇到0先将0位置后面的数据进行挪动覆盖,但是注意要从尾部开始挪动,挪动完毕后在当前位置的下一个位置插入一个数字0,让指针走两步

暴力复写参考代码:

/** @lc app=leetcode.cn id=1089 lang=cpp** [1089] 复写零*/// @lc code=start
// 暴力解法
class Solution
{
public:void duplicateZeros(vector<int> &arr){for (int i = 0; i < arr.size(); i++){if (arr[i] == 0 && arr.size() - 2 > 0){int j = arr.size() - 2;while (j + 1 < arr.size() && j > i){arr[j + 1] = arr[j];j--;}if (i + 1 < arr.size()){arr[++i] = 0;}}}}
};
//  @lc code=end
  • 双指针原地复写

对于双指针算法来说,有两种实现方式,第一种是异地复写,即开辟一个新空间,基本思路为遇到非0数字复写一次,遇到数字0复写两次,但是这个算法的空间复杂度为O(N),所以考虑原地复写

双指针——异地复写参考代码:

/** @lc app=leetcode.cn id=1089 lang=cpp** [1089] 复写零*/// @lc code=start
// 双指针——异地操作
class Solution
{
public:void duplicateZeros(vector<int> &arr){vector<int> ret;ret.resize(arr.size());int cur = 0;int dest = 0;while (dest < ret.size()){if (arr[cur] == 0){dest++;dest++;cur++;}else{ret[dest++] = arr[cur++];}}arr.assign(ret.begin(), ret.end());}
};
//  @lc code=end

原地复写和异地复写的思路是一致的,但是原地复写不可以从源数组的第一个元素开始复写,这样会导致遇到数字0时后面的内容全部都覆盖为0,正确的做法是从最后一个待复写元素开始向最后一个位置进行复写,再依次往前遍历执行复写操作,复写具体操作为:

  1. 遇到非0数字向dest位置覆写当前cur位置的数字
  2. 遇到0数字向dest位置和dest-1位置复写两个0
  3. cur向前移动1步

现在的问题就是如何找到最后一个待复写的元素,可以考虑一次正向遍历,但是在这一次遍历中不进行任何的复写操作,具体操作为:

  1. cur所在位置是非0的数字:dest移动一步
  2. cur所在位置是数字0:dest移动两步
  3. 判断dest是否到最后一个元素的位置
  4. cur移动一步

遍历完成后cur所指向的位置即为最后一个待复写的元素,而dest所指向的位置即为最后一个元素的位置,如图所示:

但是此时需要注意一种特殊情况:

当指向的待复写元素是0时,那么此时dest指向的位置已经超出了数组的范围,如果此时在dest位置复写时就会出现越界访问的情况,那么此时需要进行边界修正,修正方法如下:

  1. dest-1的位置处覆写数字0
  2. cur向前走动一步
  3. dest向前走动两步

处理完边界情况后就可以进行正常的复写操作过程

双指针——原地复写参考代码:

/** @lc app=leetcode.cn id=1089 lang=cpp** [1089] 复写零*/// @lc code=start
// 双指针——原地操作
class Solution
{
public:void duplicateZeros(vector<int> &arr){int cur = 0, dest = -1;int sz = arr.size();// 找到结果数组中的最后一个重写的元素的位置while (cur < sz){if (arr[cur] == 0){dest += 2;}else{dest++;}if (dest >= sz - 1){break;}cur++;}// 修正边界情况if (dest == sz){arr[dest - 1] = 0;cur--;dest -= 2;}// 覆写while (cur >= 0){if (arr[cur]){arr[dest--] = arr[cur--];}else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};
//  @lc code=end

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

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

相关文章

oppo手机怎样录屏?新手必看指南来了

“有人知道oppo手机怎样录屏吗&#xff1f;刚刚换了新款的oppo手机&#xff0c;它的屏幕显示效果和性能都让我感到非常满意&#xff0c;但是在尝试使用录屏功能时遇到了些困难&#xff0c;找了半天都没找到正确的开启方式&#xff0c;有没有哪位oppo手机用户知道如何打开录屏功…

美港通正规炒股市场沪指收跌0.82% 证券板块调整

5月15日电 15日,A股三大指数集体下挫。上证指数跌0.82%,报3119.9点;深证成指跌0.88%,报9583.54点;创业板指跌0.9%,报1838.89点。沪深京三市成交额7651亿元,其中沪深两市7611亿元,较上日缩量635亿元。沪深两市超3800只个股下跌。 美港通证券以其专业的服务和较低的管理费用在市…

后台菜单数据递归展示

后台菜单数据递归展示 效果示例图aslide.vueaslideItem.vuemenu 效果示例图 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

IntelliJ IDEA 配置JDK

IntelliJ IDEA-之配置JDK 我们的开发神器IDEA安装好了之后&#xff0c;在实际开发中&#xff0c;我们如何去配置好JDK的版本呢&#xff1f; 注意&#xff1a;需要保证JDK在已经成功安装的情况下&#xff0c;再进行IDEA的配置 现在就行动&#xff0c;让IntelliJ IDEA成为你征…

Nginx启动关闭重启用脚本实现

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Nginx(“engine x”…

Windows 10无法远程桌面连接:原因及解决方案

在信息技术日益发展的今天&#xff0c;远程桌面连接已成为企业日常运维、技术支持乃至个人用户远程办公的必备工具。然而&#xff0c;有时我们可能会遇到Windows 10无法远程桌面连接的问题&#xff0c;这无疑会给我们的工作和生活带来诸多不便。 原因分析 1、远程访问未启用&a…

AI智能体|案例实操:使用扣子Coze创建医药助手Bot

大家好&#xff0c;我是无界生长。 最近在做AI智能体定制项目&#xff0c;疯狂接单中&#xff0c;大家如果有定制需求可以联系我。下面分享一个实操案例&#xff1a;使用扣子Coze创建医药助手Bot&#xff0c;为了方便演示&#xff0c;对案例中的数据进行了简化及脱敏&#xff0…

JUnit5测试用例调度

maven中的junit5的一些注意点&#xff1a; maven-surefire-plugin maven对应有默认配置当需要修改一些测试相关执行策略的时候&#xff0c;就需要重修配置这个插件 mvn执行测试用例 命令行执行&#xff1a;通过按ALT和F12打开idea的终端 mvn test &#xff1a;执行案例下的…

GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))

1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09; 文章目录 1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09;每博一文案2. 代理模式的理解3. 静态代理4. 动…

使用Flask-RESTful构建RESTful API

文章目录 安装Flask-RESTful导入模块和类创建一个资源类运行应用测试API总结 Flask是一个轻量级的Python web开发框架&#xff0c;而Flask-RESTful是一个基于Flask的扩展&#xff0c;专门用于构建RESTful API。它提供了一些帮助类和方法&#xff0c;使构建API变得更加简单和高效…

R实验 基础(二)

实验目的&#xff1a; 掌握向量的几种类型&#xff1a;数值向量、逻辑向量、字符向量、复数向量&#xff1b;掌握生成向量几个的函数使用和向量的下标运算&#xff1b;掌握因子的定义和相关函数的使用。 实验内容&#xff1a; R语言中&#xff0c;数值向量用得非常多。生成数…

探索Docker:在本地开发与云端部署之间实现无缝切换

探索Docker&#xff1a;在本地开发与云端部署之间实现无缝切换 摘要&#xff1a; 在这个时代&#xff0c;我们都在寻找一种能够在本地和云端无缝切换的解决方案。我们的团队和一群【老六】一起&#xff0c;研究了如何使用Docker来实现这个目标。我们的研究成果将帮助IT开发人员…