【优选算法专栏】专题一:双指针--------1.移动0

简介: 【优选算法专栏】专题一:双指针--------1.移动0


题目来源

本题来源为:

Leetcode283:移动零

题目描述:

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

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

题目解析

这个题目要实现的其实就是将0移动到后面,

要注意三点:

  1. 0 要移动到数组的末尾
  2. 保持非零元素的相对顺序
    这个怎么理解呢?举个例子:

    在这个示例中,未移动前非0元素的顺序为1 3 12,那么移动0之后非0元素也要保持一个1 3 12的顺序。
  3. 不能开辟一个新的数组,要原地操作。

算法原理

对于移动0本题来说,是一个很典型的题目,本题还可以规划到数组划分(或者数组分块)这一类。

什么是数组划分呢?数组划分就是将一个原数组划分为不同区域。

如下图所示,可以将数组划分为若干个区域,而对于本题而言:

就是将原数组划分为两个区域:非0元素区间与0元素区间。

而解决数组划分这一类题,我们最容易想到也是最简单解决的办法----双指针算法

那么什么是双指针算法呢?

双指针算法就是定义两个指针,通过模拟两个指针的走向来解决问题,化繁为简。但是并不是说双指针就要必须强行定义两个指针,双指针是一个思想,用数组下标也可以来充当指针,定义两个变量也可以充当指针。

对于本题而言:

两个指针的作用可以这样定义:

  1. cur:从左往右扫描数组,达到遍历数组
  2. dest:已处理的区间内,非0元素的最后一个位置。

通过双指针我们可以将这个数组分为二大个区间:

处理过的区间与未处理的区间,在处理过的区间内可以又分成两个区间:非0元素区间与0元素区间。

不停向后遍历,知道cur遍历完整个数组为止。

下面我们用具体示例来模拟一下这个过程:

通过动图,我们可以总结双指针式如何做到的:

在cur从前往后遍历数组时:

  1. 遇到非0元素:cur++
  2. 遇到非0元素:
    先交换dest+1与cur的位置,然后让dest++,cur++;
    注意:dest的起始位置是-1(没进行遍历前还不知道非0元素具体在哪一个位置)。

代码实现

class Solution 
{
public:
    void moveZeroes(vector<int>& nums) 
    {
       for(int cur=0,dest=-1;cur<nums.size();cur++)
        { 
            //处理非0元素
            if(nums[cur])
            {
                dest++;
                //交换dest+1与cur的位置
                swap(nums[dest],nums[cur]);
            }
        }
    }
};
相关文章
|
2月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
8月前
|
算法
双指针算法
双指针算法
55 2
|
5月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
99 4
|
4月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
6月前
|
算法 容器
【算法】双指针
【算法】双指针
|
6月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
8月前
|
人工智能 算法 网络性能优化
【调度算法】服务组合优选问题的指标选择与评估
【调度算法】服务组合优选问题的指标选择与评估
129 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。

热门文章

最新文章