【LeetCode刷题笔记(4)】【Python】【移动零】【简单】

文章目录

  • 题目描述
    • 示例 1
    • 示例 2
    • 提示
  • 解决方案
    • 题意拆解
    • 双指针算法
      • 双指针法的主要优点
      • 双指针法的使用场景举例:
    • 解决方案:【双指针+一次遍历】
      • 解题心得
      • 方案代码
      • 运行结果
      • 复杂度分析
  • 结束语

移动零

题目描述

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

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

示例 1

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

示例 2

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

提示

  1. 1 <= nums.length <= 104
  2. -231 <= nums[i] <= 231 - 1

解决方案

题意拆解

根据题意,如果要在在不复制数组的情况下解决这个问题,==> 需要一个满足O(1)空间复杂度的算法,并且适合解决数组/列表数据结构的问题 ==> 自然想到双指针算法

双指针算法

双指针法是一种常用的算法思想,用于解决数组和链表等数据结构的问题。它的基本思想是使用两个指针(不一定真是指针,能存储相应元素的位置/索引就行)分别标记两个位置/索引,然后通过指针所指元素的性质对数组进行修改,同时指针进行移动完成目标的方法。

双指针法的主要优点

  1. 时间复杂度为O(n):双指针法通常可以在一次遍历中解决问题,因此时间复杂度为O(n)。
  2. 空间复杂度为O(1):双指针法通常只需要常数级别的额外空间,因此空间复杂度为O(1)。

双指针法的使用场景举例:

  1. 数组或链表操作:双指针法可以用于在数组或链表中查找、删除、插入等操作。
  2. 区间问题:双指针法可以用于解决区间相关的问题,如查找区间内的最大值、最小值等。
  3. 排序问题:双指针法可以用于快速排序、归并排序等排序算法中,提高算法的效率。

解决方案:【双指针+一次遍历】

我们可以定义两个指针leftright,其中:

  • 左指针left:标记当前非零元素应该放置的位置
  • 右指针right:标记当前遍历到的位置。

当我们通过右指针的移动遍历数组元素时,

  • 如果当前元素不为0,则将其与left位置的元素交换,并将leftright都向后移动一位。
    • 指针left向后移动一位的原因:更新下一个非零元素应该放置的位置;
    • 指针right向后移动一位的原因:遍历下一个数组元素;
  • 如果当前元素为0:
    • 需要移动右指针right —> 遍历下一个数组元素;
    • 不需要移动左指针left —> 当前位置仍然是下一个非零元素应该放置的位置;

当循环结束后,所有非零元素都会被移动到数组的前面,而所有0元素则会被移动到数组的末尾。

解题心得

对左指针left和右指针right的具体功能有明确的认知,可以更好地帮助我们理解算法的运行逻辑。

方案代码

from typing import List  class Solution:  def moveZeroes(self, nums: List[int]) -> None:  """  将数组中的所有零移动到数组的末尾,保持非零元素的相对顺序。  Args:  nums (List[int]): 待操作的数组。  Returns:  None: 该函数没有返回值,直接修改传入的数组。  """  n = len(nums)  # left和right分别表示当前非零元素应该放置的位置和当前遍历到的位置。  left = 0  # left初始化为0,表示第一个位置是非零元素应该放置的位置。  right = 0  # right初始化为0,表示开始从数组的第一个位置遍历。  # 通过右指针的移动遍历数组while right < n:  # 如果当前遍历到的元素不为0,则将其与left位置的元素交换,并将left和right都向后移动一位。  if nums[right] != 0:  nums[left], nums[right] = nums[right], nums[left]  left += 1  right += 1

运行结果

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组nums元素的数量。
    • 需要遍历数组每一个元素 ===> O(N)
  • 空间复杂度:O(1)
    • 只需要存放若干变量 ===> O(1)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

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

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

相关文章

代码随想录第三十一天(一刷C语言)|无重叠区间划分字母区间合并区间

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、无重叠区间 思路&#xff1a;参考carl文档 按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。 ledcode题目&a…

多线程------ThreadLocal详解

目录 1. 什么是 ThreadLocal&#xff1f; 2. 如何使用 ThreadLocal&#xff1f; 3. ThreadLocal 的作用 4. ThreadLocal 的应用场景 5. ThreadLocal 的注意事项 我的其他博客 ThreadLocal 是 Java 中一个很有用的类&#xff0c;它提供了线程局部变量的支持。线程局部变量…

家政服务小程序预约上门,让服务更便捷

随着人们生活节奏的加快&#xff0c;家政服务行业越来越受到人们的欢迎。为了满足市场需求&#xff0c;提高服务质量&#xff0c;家政公司需要开发一款预约上门的家政服务小程序。本文将详细介绍如何制作一个预约上门的家政服务小程序。 一、登录乔拓云网后台 首先&#xff0c…

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…

【Stm32-F407】Keil uVision5 下新建工程

①双击鼠标左键打开Keil uVision5&#xff0c;选择 Project 下的 New uVision Project &#xff1b; ②在期望的文件夹下创建一个工程&#xff0c;并按如下要求操作&#xff1b; ③添加文件类型&#xff0c;按如下要求操作 ④如有需要可添加相关启动文件在工程文件夹下并添加到…

深度学习中的高斯分布

1 高斯分布数学表达 1.1 什么是高斯分布 高斯分布(Gaussian Distribution)又称正态分布(Normal Distribution)。高斯分布是一种重要的模型&#xff0c;其广泛应用与连续型随机变量的分布中&#xff0c;在数据分析领域中高斯分布占有重要地位。高斯分布是一个非常常见的连续概…

ArrayList与顺序表(带完整实例)

【本节目标】 1. 线性表 2. 顺序表 3. ArrayList的简介 4. ArrayList使用 5. ArrayList的扩容机制 6. 扑克牌 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表…

Mysql 计算地理位置信息

mysql 处理空间关系 MySQL提供了一系列的函数来帮助我们处理空间对象之间的关系&#xff0c;如 ST_Intersects、ST_Contains 等。这些函数可以帮助我们判断空间对象之间的位置关系&#xff0c;并在此基础上执行相应的查询。 多边形查询 在实际应用中&#xff0c;需要查询某个…

【CSS 渐变Gradient详解】线性渐变、径向渐变、锥形渐变及重复渐变

渐变 gradient https://developer.mozilla.org/zh-CN/docs/Web/CSS/gradient https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_images/Using_CSS_gradients CSS 属性值定义语法 https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle https://developer.mozilla.org/…

HTTP 301错误:永久重定向,大勇的冒险之旅

大家好&#xff0c;我是大勇&#xff0c;一个喜欢冒险的程序员。今天&#xff0c;我要和大家分享一个我在互联网世界中的冒险故事——如何处理HTTP 301错误&#xff1a;永久重定向。 那天&#xff0c;我像往常一样&#xff0c;打开我的代码编辑器&#xff0c;准备开始一天的工…

Python实现多种图像去噪方法

Python实现多种图像去噪方法&#xff1a;中值滤波&#xff0c;均值滤波&#xff0c;高通滤波&#xff0c;低通滤波&#xff0c;高斯滤波&#xff0c;同态滤波 图像和视频逐渐成为人们生活中信息获取的重要来源。人们准确地获取信源发出的图像和视频信息需要保证在传输过程中的…

Ganache结合内网穿透实现远程或不同局域网进行连接访问

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

解决nuxt3报错:The requested module xxx does not provide an export named ‘PropType‘

现象如下&#xff1a; 从表象上就是typescript找不到PropType的类型声明 原因&#xff1a;这是vue3已知的type类型导入时存在的一个问题&#xff0c;而且一直没有得到解决 No matching export for import typescript interface Issue #2117 vitejs/vite GitHub 代码里面导…

IncDec序列

title: IncDec序列 date: 2023-12-14 21:10:36 tags: 差分 categories: 算法进阶指南 —>传送门 题目大意 解题思路 区间操作&#xff0c;可以考虑差分。观察发现&#xff0c;最终变成相同的数&#xff0c;相当于相邻的两个数之差为 0 0 0&#xff0c;因此我们使用差分。先…

c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

快速排序介绍&#xff1a; 快速排序是一种非常常用的排序方法&#xff0c;它在1962由C. A. R. Hoare&#xff08;霍尔&#xff09;提的一种二叉树结构的交换排序方法&#xff0c;故因此它又被称为霍尔划分&#xff0c;它基于分治的思想&#xff0c;所以整体思路是递归进行的。 …

不会设计Logo,不如来看看这9个Logo设计软件!

优秀的 Logo 是企业的形象展示。大公司将花费数万甚至数百万定制特色标志。由于预算有限&#xff0c;一些中小企业或企业家往往希望找到更具成本效益的渠道。这里有 9 个免费的 Logo 设计软件。用户可以通过输入品牌名称来生成自己的 Logo。 1、即时设计 即时设计是一个国内的…

Tomcat部署(图片和HTML等)静态资源时遇到的问题

文章目录 Tomcat部署静态资源问题图中HTML代码启动Tomcat后先确认Tomcat是否启动成功 Tomcat部署静态资源问题 今天&#xff0c;有人突然跟我提到&#xff0c;使用nginx部署静态资源&#xff0c;如图片。可以直接通过url地址访问&#xff0c;为什么他的Tomcat不能通过这样的方…

leetcode 904. 水果成篮(优质解法)

代码&#xff1a; class Solution {public int totalFruit(int[] fruits) {int lengthfruits.length;int []fruitNumsnew int[length1]; //用于记录各个种类摘了多少个水果int count0; //用于记录当前采摘了几种水果int sum0; //用于记录当前共摘了多少水果for(int left0…

Peter算法小课堂—简单建模(2)

太戈编程736题 题目描述&#xff1a; 你是一只汪星人&#xff0c;地球毁灭后你回到了汪星&#xff0c;这里每天有n个小时&#xff0c;你需要为自己选择正好连续的m小时作为每天睡眠的时间。从凌晨开始&#xff0c;第i小时内的睡眠质量为xi&#xff0c;请问经过选择后&#xf…

详解—C++右值引用

目录 一、右值引用概念 二、 左值与右值 三、引用与右值引用比较 四、值的形式返回对象的缺陷 五、移动语义 六、右值引用引用左值 七、完美转发 八、右值引用作用 一、右值引用概念 C98中提出了引用的概念&#xff0c;引用即别名&#xff0c;引用变量与其引用实体公共…