leetcode-283.移动零-day13

方法一:双指针遇 0 交换

1. 基本思路回顾

该方法使用了两个指针mim用于标记当前已经处理好的非零元素应该放置的位置,i用于遍历整个数组。当遇到nums[m]0时,会通过内层while循环找到下一个非零元素(如果存在的话),然后将这个非零元素与nums[m]进行交换,使得非零元素不断往前移动,最终实现将所有零元素移到数组末尾的效果。

2. 时间复杂度分析

  • 最好情况:数组本身就是已经将非零元素排在前面,零元素排在后面的有序状态,此时内层while循环每次都不会执行,整个算法只需要遍历一遍数组,时间复杂度为 ,其中n是数组nums的长度。
  • 最坏情况:数组中所有元素都是0,那么对于每个0元素(也就是每次nums[m]0时),内层while循环都要一直执行到数组末尾才能找到下一个非零元素(实际上不存在),此时时间复杂度会达到 。平均情况下,时间复杂度介于最好和最坏情况之间,更接近 ,因为存在较多0元素的情况是比较容易出现的,且每次找下一个非零元素都可能需要遍历剩余的部分数组。
3. 空间复杂度分析

该方法只使用了有限的额外变量(如mi以及一些临时用于判断和交换的变量),没有使用与输入数组规模相关的额外数据结构,所以空间复杂度为 ,属于原地算法,不需要额外的大量存储空间。

4. 相对不足

  • 效率不稳定:时间复杂度在不同输入情况下差异较大,特别是在存在较多0元素的数组中,效率会变得很低,因为存在大量的内层循环遍历操作。
  • 代码逻辑稍复杂:存在内层while循环以及多个边界条件判断(如判断i是否越界等),代码的可读性和可维护性相较于更简洁的实现方式会稍差一些,容易出现边界情况考虑不周全导致的错误。

方法二:双指针交换非零元素

1. 基本思路回顾

这个方法同样使用了两个指针iji用于遍历整个数组,j用于标记下一个可以放置非零元素的位置。当nums[i]不为0时,就将nums[i]nums[j]进行交换,然后j自增,保证了非零元素会按照顺序依次放置在数组的前部,最终也能实现将零元素移到数组末尾的目的。

2. 时间复杂度分析

无论输入数组的元素分布情况如何,该方法都只需要遍历一遍数组即可完成零元素的移动操作,对于每个元素,最多执行一次交换操作,所以时间复杂度稳定为 ,效率比较稳定,不受数组中零元素具体分布情况的影响。

3. 空间复杂度分析

和方法一类似,只使用了有限的几个额外变量(如ij以及用于交换的临时变量tmp),空间复杂度为 ,也是原地算法,不会占用额外大量的内存空间。

4. 相对不足

  • 功能扩展性稍弱:该方法的代码结构比较简洁地实现了移动零元素这个特定功能,但如果后续需要在移动零元素的同时对非零元素进行更复杂的处理(比如按照特定规则排序非零元素等),可能需要对代码结构进行较大幅度的修改,不像一些更通用的排序或调整算法那样容易扩展功能。
  • 通用性局限:相对一些通用的数组元素调整算法而言,它只针对移动零元素这个特定需求进行了优化,如果需求变更为移动其他特定值或者按照更复杂规则调整数组元素顺序,可能无法直接复用,需要重新编写逻辑。

总体比较

综合来看,方法二在时间复杂度方面表现更优,具有稳定的  时间复杂度,能高效地处理各种输入情况。而方法一虽然也能实现功能,但时间复杂度受输入数据影响较大,最坏情况效率很低。在代码可读性和可维护性上,方法二相对简洁清晰一些,方法一由于复杂的边界情况处理和嵌套循环使得代码更易出错。不过在一些特定场景下,如果代码所在的环境对空间复杂度要求极为苛刻且输入数据基本能保证较好的情况(比如基本不会出现大量连续0的情况),方法一也是可以考虑使用的一种实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python入门】Python控制成分

文章一览 一 、顺序结构二、分支结构多分支结构 三、循环结构1. for语句循环结构range()函数 2. while语句构成循环1)while 循环流程 3、for 循环和 while 循环的区别4、for 循环和 while 循环效率比较 四、函数1、函数定义1) 内置函数2) 非内…

scala中模式匹配的应用

package test34object test6 {case class Person(name:String)case class Student(name:String, className:String)// match case 能根据 类名和属性的信息,匹配到对应的类// 注意:// 1 匹配的时候,case class的属性个数要对上// 2 属性名不需…

【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制

当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(一)5.1.2 饼图布局生成器(二)5.1.3 圆弧的绘制(三)5.1.4 数据标签的添加(四&#…

IP地址查询的背后②:IP地址(IPv4)的构成、类型以及子网划分

自从各大平台将IP地址显示之后,相信广大网友对于IP地址相当不陌生了。而我们见到的IP地址往往只会显示在某市,更仔细的会看到有一段段字节所显示的字符串,而IP地址看似由很简单的1-255之间的数字所组成的四个部分,但其实质上则是二…

使用 DeepSpeed 微调 OPT 基础语言模型

文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…

计算机网络-GRE Over IPSec实验

一、概述 前情回顾:上次基于IPsec VPN的主模式进行了基础实验,但是很多高级特性没有涉及,如ike v2、不同传输模式、DPD检测、路由方式引入路由、野蛮模式等等,以后继续学习吧。 前面我们已经学习了GRE可以基于隧道口实现分支互联&…

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动 Turtle库是Python标准库的一部分,它提供了一种基于命令的图形绘制方式。Turtle模块通过一个“海龟”(Turtle)对象在屏幕上移动…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天,p9-p27 总结,总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是:c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum am…

Qt:QMetaObject::connectSlotsByName实现信号槽自动关联

简介 在Qt中,QMetaObject::connectSlotsByName 是一个便利的方法,它可以根据对象的对象名(objectName)自动将信号和槽连接起来。但是,要使用这个方法,必须确保: 1 控件(如按钮&…

国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异

在现代安防视频监控系统中,国标GB28181协议作为公共安全视频监控联网系统的国家标准,该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求,还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议&#xff0c…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率,二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

长短期记忆网络(LSTM):深度学习中的序列数据处理利器

目录 ​编辑 长短期记忆网络(LSTM):深度学习中的序列数据处理利器 引言 LSTM的起源与背景 LSTM的核心机制 LSTM的优势 LSTM的应用案例 LSTM的研究进展 LSTM的变种 LSTM的改进 LSTM的最新研究 结论 长短期记忆网络(LST…

2024年前端面试题【基本功篇】

文章目录 前言一、html 相关1.1 行内元素和块级元素分别有哪些?1.2 IE盒子模型和标准盒子模型 二、css 相关2.1 选择器2.2 设置垂直居中的方法2.3 定位的几种方式2.4 清除浮动的几种方式2.5 rem、em、px、vw、vh区别2.6 响应式和自适应布局的区别2.7 元素隐藏的几种…

Excel设置生日自动智能提醒,公式可直接套用!

大家好,我是小鱼。 今天跟大家分享一个WPS表格中根据出生日期,设置生日提醒,并且根据距离生日天数自动标记数据颜色。简单又实用,一个公式轻松搞定! 接下来我们先学习一下需要使用到的函数,然后再根据实例让…

【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南

硬件:Apple M4 Pro 16寸 系统: macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio,网址:https://developer.android.com/studio?hlzh-cn 2.下载加速器,注册账号,开启加速器。网址:放在文末。 3.下载安卓代码,项目的路径上不能有中文,特别是…

VMware虚拟机Ubuntu 18.04版本 磁盘扩容

一、版本配置 虚拟机版本:VMware WORKSTATION 16 PRO Ubuntu版本:Ubuntu 18.04 二、磁盘大小介绍 目的:磁盘扩容(20G----->100G),从20G扩到100G 查看磁盘大小命令:df -h 扩容前的磁盘大小 …

10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹

本文记录当前最新版虚拟机VMware Workstation Pro(2024.12)如何在win11下共享文件,以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机,打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…

HTTP—03

触发 GET 请求 1)直接在浏览器 地址栏 输入 URL,此时构成了一个GET请求 2)HTML中的一些特殊标签可能会触发 例如 img,a,link,script... 3)通过Form表单触发(Form本质也是一个HTML标签) 4&#xff0…

2024年《网络安全事件应急指南》

在这个信息技术日新月异的时代,网络攻击手段的复杂性与日俱增,安全威胁层出不穷,给企事业单位的安全防护能力带 来了前所未有的挑战。深信服安全应急响应中心(以下简称“应急响应中心”)编写了《网络安全事件应急指南》…