【算法|双指针系列No.2】leetcode1089. 复写零

这篇具有很好参考价值的文章主要介绍了【算法|双指针系列No.2】leetcode1089. 复写零。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
【算法|双指针系列No.2】leetcode1089. 复写零,LeetCode,手撕算法系列专栏,算法,c++

点击直接跳转到该题目

1️⃣题目描述

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例一

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例二

  • 输入:arr = [1,2,3]
    输出:[1,2,3]
    解释:调用函数后,输入的数组将被修改为:[1,2,3]

2️⃣算法分析

解题思路:

  • 1.先找到最后一个复写的数
    [1,0,2,3,0,4,5,0]为例进行演示:
    寻找最后一个复写的数依然是使用的双指针算法,具体步骤如下:

1.先判断cur的值,
2.根据cur的值来判断dest向后移动一步或者两步
3.判断dest是否到结束位置
4.cur++
此过程结束后cur指的值就是最后一个要复写的数,而dest指向的就是倒数第一个位置(这里先不考虑边界情况)

第一步结束之后结果如下图所示:
【算法|双指针系列No.2】leetcode1089. 复写零,LeetCode,手撕算法系列专栏,算法,c++

  • 2.处理边界情况

这里有一个特殊例子,即[1,0,2,3,0,4],请看:
【算法|双指针系列No.2】leetcode1089. 复写零,LeetCode,手撕算法系列专栏,算法,c++

我们会发现如果不考虑边界问题的话,很有可能导致dest越界。所以我们需要对边界问题进行特殊处理。
之所以会越界就是因为上图红色标记的位置是0导致的。

处理边界代码如下:

 if(dest == n)
{
    arr[n-1] = 0;
    cur--;dest -= 2;
}
           
  • 3.从后往前进行复写
    之所以从后往前进行复写是因为如果从前往后复写的话会覆盖后面的数据。因此这里需要从后往前进行复写。

3️⃣代码编写

整个代码编写如下:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 1.找到最后一个复写位置
        int cur = 0,dest = -1,n = arr.size();
        while(cur <~~  n)
        {
            if(arr[cur]) dest++;
            else dest += 2;
            if(dest >= n - 1) break;
            cur++;
        }

        // 2.处理边界情况
        if(dest == n)
        {
            arr[n-1] = 0;
            cur--;dest -= 2;
        }
           

        // 3.从后往前完成复写操作
        while(cur >= 0)
        {
            if(arr[cur]) arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

【算法|双指针系列No.2】leetcode1089. 复写零,LeetCode,手撕算法系列专栏,算法,c++
【算法|双指针系列No.2】leetcode1089. 复写零,LeetCode,手撕算法系列专栏,算法,c++文章来源地址https://www.toymoban.com/news/detail-643472.html

到了这里,关于【算法|双指针系列No.2】leetcode1089. 复写零的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(57)
  • 【手撕算法|动态规划系列No.2】leetcode面试题 08.01. 三步问题

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(51)
  • 【手撕算法|动态规划系列No.1】leetcode1137. 第 N 个泰波那契数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月11日
    浏览(43)
  • 【算法|双指针系列No.4】leetcode11. 盛最多水的容器

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月06日
    浏览(38)
  • LeetCode —— 复写零(双指针)

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 将数组中出现的每个零复写一遍,然后将其他元素向右平移,数组长度不能改变。      

    2024年02月10日
    浏览(30)
  • 【算法|动态规划系列No.5】leetcode62. 不同路径

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(32)
  • 力扣:1089. 复写零

    今日分享一道力扣经典题目,复写0! 题目如下: 题目要求是进行复写0,而且不能超过原数组长度,且只能在原地进行操作! 解决本题最好的方法就是进行双指针方法! 一、双指针算法先 找到最后一个要复写的数 ! 二、然后 从后向前进行完成复写 (因为如果要是从前向

    2024年02月06日
    浏览(23)
  • 【快乐手撕LeetCode题解系列】——消失的数字

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2024年02月01日
    浏览(28)
  • 【快乐手撕LeetCode题解系列】——移除元素

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2023年04月15日
    浏览(30)
  • LeetCode 1089. Duplicate Zeros

    Given a fixed-length integer array  arr , duplicate each occurrence of zero, shifting the remaining elements to the right. Note  that elements beyond the length of the original array are not written. Do the above modifications to the input array in place and do not return anything. Example 1: Example 2: Constraints: 1 = arr.length = 104 0 = arr[i] = 9 这题

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包