当前位置: 首页 > article >正文

【力扣】复写零,栈 + 双指针法

复写零原题地址

方法一:双指针法

从前向后复写,会造成覆盖。所以,应该从后向前复写,这样我们可以考虑维护一个栈。遍历数组,如果遇到非零元素,就入栈一次;如果遇到零,就入栈两次。当栈中的元素个数超出数组的元素个数时,把栈中的元素重新从后向前写入数组即可

如:对于数组 [1 2 0 0 3 0 4] ,

1 :入栈 1 次: [1]

2 :入栈 1 次: [1 2]

0 :入栈 2 次: [1 2 0 0]

0 :入栈 2 次: [1 2 0 0 0 0]

3 :入栈 1 次: [1 2 0 0 0 0 3]

此时栈中元素个数和数组元素个数相等,重新写入数组即可。

再举一个例子,对于数组 [1 2 0 0 3 0 4 5]

1 :入栈 1 次: [1]

2 :入栈 1 次: [1 2]

0 :入栈 2 次: [1 2 0 0]

0 :入栈 2 次: [1 2 0 0 0 0]

3 :入栈 1 次: [1 2 0 0 0 0 3]

0 :入栈 2 次: [1 2 0 0 0 0 3 0 0]

此时栈中元素个数比数组元素个数多一个,需要去掉最后一个零,把 [1 2 0 0 0 0 3 0] 写入数组。

由于不允许开辟 O(N) 的额外空间,我们可以考虑用 top 来维护栈顶(即栈中的有效数据个数),模拟出入栈过程。假设数组长度为 n ,当 top<n 时,可以继续入栈

用下标 i 来记录要复写的元素,下标 j 来记录复写的目标位置。在前面模拟入栈的过程中,可以记录最后一个入栈的元素在数组中的下标,即 i 。由于是从后向前复写, j 要初始化为 n-1 。

对于栈中元素个数比数组元素个数多一个,即 top==n+1 的特殊情况,最后一个零只需要复写一次,其余情况正常复写即可。复写时,把 [0,i] 的元素按照是否为零进行分类,非零元素复写一次,零复写两次。

// 方法一:双指针
class Solution
{
public:
    void duplicateZeros(vector<int>& arr)
    {
        int n = arr.size();
        int top = 0; // 记录栈顶
        int i = -1;
        // 模拟把数组元素放入栈中
        while (top < n)
        {
            if (arr[++i])
            {
                ++top;
            }
            else
            {
                top += 2;
            }
        }

        // i 表示要复写的数据
        // j 表示要复写的位置
        int j = n - 1;
        // 最后放入 2 个零导致栈中元素比数组多
        if (top == n + 1)
        {
            arr[j--] = 0;
            --i;
        }

        while (j > 0)
        {
            // 第一次复写
            arr[j--] = arr[i];
            // 零还需要复写第二次
            if (arr[i--] == 0)
            {
                arr[j--] = 0;
            }
        }
    }
};


http://www.kler.cn/a/233383.html

相关文章:

  • 专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结
  • ios swift开发--ios远程推送通知配置
  • c++写一个死锁并且自己解锁
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • 排序算法 - 冒泡
  • 【云计算解决方案面试整理】1-2云计算基础概念及云计算技术原理
  • 张楠辞任抖音集团CEO;东方甄选将开服饰号;小红书新增“附近”一级入口;华为分红770亿元
  • Vue3中路由配置Catch all routes (“*“) must .....问题
  • 通过Harbor构建docker私服仓库
  • 前端使用pdf.js进行pdf文件预览的第二种方式:Viewer.html
  • Quartus工程的qsf配置约束文件介绍
  • 【C语言】一道相当有难度的指针某大厂笔试真题(超详解)
  • 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
  • RTE2023第九届实时互联网大会:揭秘未来互联网趋势,PPT分享引领行业新思考
  • Python基础篇_修饰符(Decorators)【下】
  • 常用的正则表达式
  • 一条 SQL 查询语句是如何执行的
  • 探索Spring Validation:优雅实现后端数据验证的艺术
  • 数据结构-->线性表-->单链表
  • JAVA面试题12
  • 信号——block+pending+handler表
  • C语言常见面试题:什么是常量?C语言中有哪些类型的常量?
  • Python 小白的 Leetcode Daily Challenge 刷题计划 - 20240209(除夕)
  • 初识文件包含漏洞
  • 【OpenHarmony硬件操作】风扇与温湿度模块
  • 【Spring】Spring 对 Ioc 的实现