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

优先算法——移动零(双指针)

目录

1. 题目解析

2. 算法原理

3.代码实现 


题目: 

力扣题目链接:移动零

1. 题目解析

题目截图如下:

不过要注意,这个移动题目要求是在原数组中原地操作,不能新额外开辟一个数组来修改。

2. 算法原理

这个原理可以称之为数组划分或数组分块,特点:给了一个数组,然后又给了一个指定的规则或标准,让我们在这个规则下把这个数组划分成若干个区间。

此题目就是,给了我们一个标准,就是把非0元素放在前面,0元素放在后面。 

 这道题目就可以通过双指针算法来解决(在数组中,可以利用数组下标充当指针。因为数组的特性,可以利用它的下标索引到里面的元素。

结合起来,这个题目就可以主要分为两部分一部分是处理过的,一部分是未被处理的但是处理过的因为制定的规则也要分为两部分:一部分是非0元素,一部分是0元素。

这里定义了两个指针dest和cur,它们的作用是:

  •  cur用来从左往右扫描数组,遍历数组。
  • dest是代表着已经被处理的区间内,非0元素的最后一个位置。

所以就分成了三个区间:

  

 cur再遍历数组时会遇到两种情况:

  • 遇到0:cur向后移动一位,其他不做处理。
  • 遇到非0元素:dest先加1(dest向后移动一位),然后交换dest+1之后的位置与非0元素的位置,再让cur向后移动一位。

3.代码实现 

总结:如何做到(实现)?

cur从前往后遍历的过程中:

  1. 遇到0元素,cur++(直接让cur向后移动一位,其余不做处理)。
  2. 遇到非0元素,dest下一个位置的元素与cur当前指向的位置的元素交换,然后dest、cur都向后移动一位。
//实现代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int dest = -1;
        //因为cur要遍历数组,并且无论什么情况都会往后移动1位
        //所以写成for循环来控制cur
        for (int cur = 0; cur < nums.size(); cur++) {
            //处理非0元素,若不为0,dest下一个位置与cur交换,dest再+1
            if (nums[cur]) {    
                swap(nums[++dest], nums[cur]);
                //前置++可以实现让dest交换指向元素再向后移动1一位
            }
        }
    }
};

我们最后把代码提交一下:(题目链接) 

 制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!


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

相关文章:

  • 【时时三省】(C语言基础)文件的顺序读写
  • MySQL四种隔离级别
  • 【2024 博客之星评选】请继续保持Passion
  • Element使用表单重置如果不使用prop,重置无法生效
  • React 表单处理与网络请求封装详解[特殊字符][特殊字符]
  • 【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
  • LVGL移植教程(超详细)——基于GD32F303X系列MCU
  • 人脸美颜 API 对接说明
  • 批量剪辑视频软件源码搭建全解析,支持OEM
  • 【瑞吉外卖】-day01
  • 使用 three.js 渲染个blender模型
  • 特定机器学习问题的基准测试数据
  • 【数据价值化】数据资产变现及管理规划
  • SQL语句优化之Sql执行顺序
  • 记录如何在RK3588板子上跑通paddle的OCR模型
  • 从零开始:使用Spring Boot搭建网上摄影工作室
  • c++二级指针
  • 数据结构作业day03
  • 我们正在谈论 CI/CD
  • SpringBoot框架下安康旅游网站的设计与实现
  • css实现立体骰子
  • jEasyUI 列运算
  • 基于SSM的在线旅游美食展现管理系统源码
  • 问:数据库存储过程优化实践~
  • 空值合并运算符(??) 可选链操作符(?.)
  • 使用常数指针作为函数参数