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

打卡力扣题目八

#左耳听风 ARST 打卡活动重启#

目录

一、问题

二、解题方法一

三、解题方法二

 四、两种方法的区别


 关于 ARTS 的释义 —— 每周完成一个 ARTS:
● Algorithm: 每周至少做一个 LeetCode 的算法题
● Review: 阅读并点评至少一篇英文技术文章
● Tips: 学习至少一个技术技巧
● Share: 分享一篇有观点和思考的技术文章

 希望通过此次活动能聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。


一、问题

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

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

示例 1:

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


示例 2:

输入: nums = [0]
输出: [0]

二、解题方法一

def moveZeroes(nums):left, right = 0, len(nums) - 1while left < right:# 如果左边的元素是 0,则将左边的指针向右移动一位if nums[left] == 0:left += 1# 如果右边的元素是 0,则将右边的指针向左移动一位elif nums[right] == 0:right -= 1else:# 否则交换左右两个指针所指向的元素nums[left], nums[right] = nums[right], nums[left]left += 1right -= 1

这段代码实现了一个函数 `moveZeroes`,用于将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

函数的输入参数为一个整数数组 `nums`。

首先,我们定义两个指针 `left` 和 `right`,分别指向数组的开头和结尾。然后,我们使用一个 while 循环来遍历数组中的每个元素。在每次循环中,我们检查左右两个指针所指向的元素是否都是 0。如果是,则说明这两个元素可以交换位置,因此我们将左边的指针向右移动一位,将右边的指针向左移动一位;否则,我们将左边的指针所指向的元素与右边的指针所指向的元素交换位置,并将左边的指针向右移动一位,将右边的指针向左移动一位。

最后,当所有的 0 都被移动到了数组的末尾时,循环结束,此时数组中的所有非零元素都已经按照原来的顺序排列好了。

三、解题方法二

除了双指针法,还有一种解题方法是使用一次遍历。具体来说,我们可以定义一个变量 `index` 来表示非零元素的位置,初始值为 0。然后,我们从左到右遍历数组中的每个元素,并检查当前元素是否为 0。如果是,则说明当前元素需要被移动到数组的末尾,我们需要将 `index` 向右移动一位;否则,我们需要将 `index` 向右移动一位。

具体来说,我们可以使用一次遍历来实现这个算法。首先,我们将 `index` 初始化为 0,然后从左到右遍历数组中的每个元素 `nums[i]`。如果当前元素为 0,则说明它需要被移动到数组的末尾,我们需要将 `index` 向右移动一位;否则,我们需要将 `index` 向右移动一位。最后,我们可以将数组中的所有元素依次放到 `index` 之前的位置上即可。

这种方法的时间复杂度同样为 O(n),其中 n 为数组的长度。

def moveZeroes(nums):index = 0for num in nums:if num != 0:nums[index] = numindex += 1for i in range(len(nums) - 1, index, -1):nums[i] = 0

 四、两种方法的区别

这两种方法的主要区别在于实现的思路和时间复杂度上。

双指针法的基本思路是:从数组的两端开始遍历,如果左指针指向的元素为 0,则将左指针向右移动一位;如果右指针指向的元素为 0,则将右指针向左移动一位;否则交换左右两个指针所指向的元素。这样可以保证在一次遍历中找到所有需要被移动到末尾的 0,并且只移动了一次数组中的元素。因此,双指针法的时间复杂度为 O(n)。

而一次遍历的方法的基本思路是:从数组的第一个元素开始遍历,如果当前元素不为 0,则将其放到数组的前面一个位置上;否则说明当前元素为 0,需要将其放到数组的末尾。这样可以保证在一次遍历中找到所有需要被移动到末尾的 0,并且只移动了一次数组中的元素。但是,这种方法需要使用额外的空间来记录非零元素的位置 `index`,因此时间复杂度为 O(n),空间复杂度为 O(1)。

综上所述,双指针法的时间复杂度更低,但是需要使用额外的空间来记录指针的位置;而一次遍历的方法不需要使用额外的空间,但是时间复杂度略高一些。

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

相关文章:

  • matlab使用教程(5)—矩阵定义和基本运算
  • 用HTML写一个简单的静态购物网站
  • 如何在go中实现程序的优雅退出,go-kratos源码解析
  • Appium+python自动化(二十八)- 高级滑动(超详解)
  • github token使用方法
  • Spring属性注解对配置项名称的自动转换
  • Docker 安全 Docker HTTPS请求过程与配置
  • DevOps(三)
  • AOP的妙用
  • CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法
  • 【大数据趋势】7月30日 汇率,恒指期货的大数据趋势概率分析。
  • mac使用mvn下载node-sass 会Binary download failed, trying source
  • 【C++】开源:Muduo网络库配置与使用
  • VCS ICO - Intelligent Coverage Optimization
  • 【分布式系统】分布式系统的8个谬误
  • tinkerCAD案例:25. 量角器 - 测量角度
  • Flutter 使用texture_rgba_renderer实现桌面端渲染视频
  • linux虚拟机开机后桌面显示CentOS-7.5-x86盘片文件,并且无法远程连接虚拟机?
  • 【Spring Boot 源码学习】走近 AutoConfigurationImportSelector
  • 系统学习Linux-MySQL数据库备份(四)
  • 具身智能controller---RT-1(Robotics Transformer)(中---实验介绍)
  • 无涯教程-jQuery - load( url, data, callback)方法函数
  • 【Shell】Shell编程之免交互
  • 从Vue2到Vue3【七】——Vue2中响应式原理的实现及其缺陷
  • 用C语言实现堆排序算法
  • tauri在github上进行自动更新打包并发版过程,实战操作避坑
  • css中flex后文本溢出的问题
  • restful接口设计规范[仅供参考]
  • Metabase 远程代码执行(CVE-2023-38646)
  • 【TiDB理论知识 07】SQL执行流程