优选算法|【双指针】283.移动零

简介: 优选算法|【双指针】283.移动零

题目

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]


输出: [1,3,12,0,0]



示例 2:

输入: nums = [0]


输出: [0]

提示:

  • 1 <= nums.length <=
  • - <= nums[i] <= - 1

题目解析

题目中说,给定一个一维数组,要求

1.将一维数组中的0的都移到这个数组的后边,

2.保证数组的中原来非0元素的相对顺序

3.不能复制数组进行,也就是说,空间复杂度为0.

讲解算法原理

       这道题都可以归到数组划分(数组分块)这一类题里面。

       数组划分这类题的特点是,给定一个数组,通过一系列变化,将数组划分成若干个区域,例如这个题就是通过将数组中零元素的移动,将数组划分成非零元素和零元素两个区域。

       解决这类题,首先想到的就是双指针算法,对于数组的题目,这里的指针不是地址的意思,而是数组下标的意思。

       首先我们先定义两个指针,cur(current在英语里面是当前的现在的意思)dest(destnation有目的地id意思)

他们的作用:

cur:从左往右扫描遍历数组,因此cur前面的都是处理过的元素,dest后边都是未处理的元素,cur也是未处理段的第一个元素

dest:非零元素和零元素的分割线,因此在已扫描的区间内,dest前面的都是非零元素,dest后边是零元素,dest也是最后一个非零元素的位置

这两个指针也将数组分成了三个部分

0—dest:已处理的非零元素

dest—1-cur-1:已处理的零元素

cur—numsSize-1:未处理

我们要使每次移动cur和dest都可以将整个数组分成这三个区间。

       那么什么时候结束呢,当然是当cur扫描完整个数组,数组中dest就把整个数组分成(非零段和零段)两个部分。

上面说过cur指向待处理段的第一个元素,dest指向处理段的最后一个非零元素,刚开始时,第一个元素就未处理,所以cur应该指向第一个元素,dest应该指向-1.

接下来要开始移动了,因为dest和cur之间是零,所以cur在遇到零的时候直接+1就行。

       当cur遇到非零数字的时候,因为非零数字应该在0—dest这个区间内,而现在dest指向-1所以应该将dest+1然后将dest所指向的值和cur所指向的值进行交换。然后cur在进行+1。

先在cur所指向的值又是1所以直接+1就行。

这个是cur遇到非零数字的时候那就是dest+1,然后交换,交换之后就行。结果如下

接下来,还是cur遇到数字的情况

直到cur指向结尾的下一个就结束了

代码

void moveZeroes(int* nums, int numsSize) 
{
    int cur=0;
    int dest=-1;
    while(cur<numsSize)
    {
        if(nums[cur]==0)cur++;
        else {
            dest++;
            int temp=nums[dest];
            nums[dest]=nums[cur];
            nums[cur]=temp;
            cur++;
        }
    }
}
目录
打赏
0
0
0
0
6
分享
相关文章
双指针算法
双指针算法
85 2
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
166 4
双指针算法详解
【算法】双指针
【算法】双指针
【调度算法】服务组合优选问题的指标选择与评估
【调度算法】服务组合优选问题的指标选择与评估
194 0
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等