优选算法——双指针专题 1.移动零 2.复写零

优选算法------双指针专题 1.移动零 2.复写零

一.移动零

题目传送门(283. 移动零 - 力扣(LeetCode))

1.题目描述

2.算法原理

数组划分 数组分块

什么意思呢?就是把数组按要求划分模块

比如这道题,就是把数组划分成两个模块,前边是非0,后边是0

两个指针dest cur 将数组划分为三部分

两指针作用:

cur:从左向右扫描数组,遍历数组,cur左边就是处理过的,右边就是未处理的

dest:已处理的区间内,最后一个非0的位置

从而可以分为三个区间

当cur到n时,最后一个区间不见了,只剩下前两个区间,并且前边是非0,后边是0

cur指向第一个元素。dest因为还没有确定最后一个非0元素的位置,所以先指向-1

cur移动时会遇见两种情况

1.遇到0时,cur++,从而保证dest+1,cur-1这个区间是0

代码就是cur++

2.遇到非0时,要让这个 值加入到第一个区间,也就是0.dest这个区间,所以要dest移动到下一个位置从而扩大这个区间,并且dest移动到0,再交换此时dest和cur的位置

代码就是

swap(dest+1,cur)

dest++,cur++

3.代码实现

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int dest=-1,cur=0;cur<nums.size();cur++)
        {
            //cur每轮都++,所以不用单独写cur遇到0的情况
            if(nums[cur])//遇到非0元素时
            swap(nums[++dest],nums[cur]);
        }
    }
};

二.复写零

题目传送门(1089. 复写零 - 力扣(LeetCode))

1.题目描述

2.算法原理

双指针法,先根据"异地"操作,然后优化到"就地"操作

问题难点:直接在原数组上操作会覆盖后续元素

解决方案:分两步操作

第一步:定位最后一个需要复写的元素

使用双指针模拟复写过程:

  • cur:遍历原数组
  • dest:跟踪在新数组中的位置

特殊规则:

  • 遇到非零元素:dest移动1位
  • 遇到零元素:dest移动2位(因为零需要被复写)

当dest达到或超过数组末尾时,停止遍历,此时的cur就是最后一个需要复写的元素。

第二步:从后向前复写

从cur位置开始向前遍历:

  • 遇到非零元素:直接复制到dest位置
  • 遇到零元素:在dest位置写入两个零

边界情况处理 :

如果最后一个零恰好使dest超出数组边界,需要特殊处理:

  1. 在数组末尾写入一个零
  2. 将cur和dest指针相应调整

3.代码实现

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur=0,dest=-1,n=arr.size();
        //1.找最后一个数
        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--;
            }
        }
    }
};
相关推荐
左手の明天12 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙12 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂12 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i12 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息14 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
无名猿14 小时前
shared_ptr 完全指南:引用计数、控制块与开销
c++·性能优化·内存管理·标准库·现代c++
Sirens.15 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕15 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng16 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法