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

每日一练【移动零】

一、题目描述

283. 移动零 - 力扣(LeetCode)

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

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

二、题目解析

可以将本题划分为数组划分(数组分块)的一类题。

一般这类题可以运用双指针的思路去解决。

注意这里的指针并不是真正的指针,而是利用数组下标来充当指针

两个指针的作用:

  • cur:从左到右扫描数组,遍历数组
  • dest:已经处理的区间内,非零元素的最后一个位置(所以初始要置为-1)

所以这两个指针可以把数组分为三个区间

那这两个指针是如何做到的呢?

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

  1. 遇到0元素:cur++
  2. 遇到非零元素:

swap(dest+1,cur);然后dest和cur分别++,继续遍历。

注意快排中的双指针算法也是运用这一思想!!!

三、原码

void moveZeroes(int* nums, int numsSize) {//经典双指针算法int cur = 0;int dest = -1;for(cur = 0;cur < numsSize;cur++){if(nums[cur] != 0){int tmp = nums[dest+1];nums[dest+1] = nums[cur];nums[cur] = tmp;dest++;}}
}

四、复杂度

本题运用了双指针的算法,时间复杂度是O(N),因为cur指针遍历数组一遍,就已经按照题目要求排好序了。

空间复杂度是O(1),本题没有额外开辟数组空间。

总结,双指针算法解决数组数组划分问题,无论是时间复杂度还是空间复杂度,算法都是最优的!

http://www.lryc.cn/news/246915.html

相关文章:

  • QT修改windowTitle的名字以及图片
  • C语言-指针讲解(3)
  • 慢 SQL 分析及优化
  • PTA:计算m到n之间所有素数的和
  • Golang实现YOLO:高性能目标检测算法
  • 文档 + 模型
  • 计算机毕业设计php+bootstrap小区物业管理系统
  • Osg线程模型(选择不当,会引发崩溃)
  • 2161根据数字划分数组
  • Oracle Linux 9.3 发布
  • XML Schema中的simpleContent 元素
  • 线性分类器--分类模型
  • 【开源】基于Vue和SpringBoot的企业项目合同信息系统
  • 指针数组用指针变量模拟二维数组
  • 接口文档自动生成工具:详细教程和实用技巧
  • C语言--不创建第三个变量,实现对两个数字的交换
  • Java中的mysql——面试题+答案(数据库连接池,批处理操作)——第22期
  • 商用车的智慧眼车规级激光雷达
  • 【NI-RIO入门】为CompactRIO供电
  • 【数据结构/C++】栈和队列_链队列
  • C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)
  • HarmonyOS ArkTS Video组件的使用(七)
  • 【深度学习实验】注意力机制(四):点积注意力与缩放点积注意力之比较
  • 用于图像分类任务的经典神经网络综述
  • Linux如何查找某个路径下大于1G的文件
  • Java二级医院区域HIS信息管理系统源码(SaaS服务)
  • 自制编程语言(第三弹)定义Token
  • linux下的工具---yum
  • java全局异常处理(springboot)
  • JAVA将PDF转图片