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

news2024/11/23 3:15:23

文章目录

  • 题目描述
    • 示例 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.coloradmin.cn/o/1310906.html

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

相关文章

【Python】conda镜像配置,.condarc文件详解,channel镜像

1. conda 环境 安装miniconda即可&#xff0c;Miniconda 安装包可以到 http://mirrors.aliyun.com/anaconda/miniconda/ 下载。 .condarc是conda 应用程序的配置文件&#xff0c;在用户家目录&#xff08;windows&#xff1a;C:\users\username\&#xff09;&#xff0c;用于…

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

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

WTF ‘Questions‘

WTF ‘Tech Team Lead’ As a Tech Team Lead, your role is to oversee the technical aspects of a project or team, and to provide guidance, support, and leadership to your team members. Here are some key responsibilities and aspects of the role: Leadership …

vite(一)——基本了解和依赖预构建

文章目录 一、什么是构建工具&#xff1f;1.为什么使用构建工具&#xff1f;2.构建工具的作用&#xff1f;3.构建工具怎么用&#xff1f; 二、经典面试题&#xff1a;webpack和vite的区别1.编译方式不同2.基础概念不同3.开发效率不同4.扩展性不同5.应用场景不同6.总结&#xff…

算法:最小生成树

文章目录 生成树Kruskal算法Prim算法 本篇总结的是最小生成树算法 生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一条新边&…

浅谈USD格式

USD是什么&#xff1f;如何发展起来的&#xff1f; USD&#xff08;Universal Scene Description&#xff09;是一种开放的、可扩展的文件格式和数据交换标准&#xff0c;用于描述和交换三维计算机图形场景和资产的数据。它最初由皮克斯动画工作室开发&#xff0c;并于2012年公…

java答题小程序源码带后台

尊敬的客户大家好&#xff01;接下来由我来介绍一下晟讯答题小程序&#xff0c;晟讯答题小程序是一款专业性的答题小程序&#xff0c;技术方式为前端原生开发的小程序&#xff0c;服务端为java程序&#xff0c;且拥有独立知识产权&#xff0c;软著登字2019SR0657453。其功能集个…

gin使用自签名SSL证书与自签名证书不受信任方法解决

文章目录 1. X.509 V3证书介绍2、使用openssl生成自签名证书和解决不受信任问题2.1、生成根证书2.2、为域名生成证书申请文件2.3、为域名创建证书的扩展描述文件2.4、为域名创建证书 3、Go应用中使用自签名证书3.1、gin框架调用实现3.2、运行效果 4、使用java的bouncycastle生成…

ACM32如何保护算法、协议不被破解或者修改

ACM32具有以下几种功能&#xff0c;可以保护算法、协议不被破解或者修改。 1.存储保护  RDP读保护  WRP写保护  PCROP 专有代码读保护  MPU存储区域权限控制  Secure User Memory存储区域加密 2.密码学算法引擎  AES  HASH  随机数生成  …

DevEco Studio 项目启动工程和Device Manage

DevEco Studio 项目启动工程和Device Manage 鸿蒙&#xff08;HarmonyOS&#xff09; 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、创建虚拟机&#xff08;Device Manage&#xff09; 鸿蒙IDE创建虚拟设备入口有2个地方&…

C++:this指针

目录 前言 成员函数返回this指向的对象本身时&#xff0c;为什是返回引用类型&#xff1f; 成员函数返回this对象本身时&#xff0c;内部通常会通过拷贝构造函数来创建一个临时对象&#xff1f; 总结 前言 c通过提供特殊的对象指针&#xff0c;this指针 指向被调用的成员函…

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

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

每日好题:原来你也玩三国杀(DP动态规划)

I - 原来你也玩三国杀 Description 小 Q 最近听说 “很多” acmer 都爱上了一款游戏《三国杀》。因为小 Q 是一个初学者&#xff0c;所以想自己先偷偷学习一下&#xff0c;然后惊艳所有人。但又因为小 Q 不屑于使用一般的武将&#xff0c;因为他觉得唯有操作型武将才能显得自…

虾皮选品网:如何使用虾皮选品数据软件提升您的选品策略

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;了解市场趋势、竞争程度和产品潜力是非常重要的。为了帮助卖家更好地分析虾皮市场&#xff0c;并为选品和运营策略提供有力支持&#xff0c;有一些数据软件和工具可以派上用场。本文将介绍一些建议使用的虾皮…

Kafka-集群架构设计

Kafka的Zookeeper元数据梳理 zookeeper整体数据 Kafka将状态信息保存在Zookeeper中&#xff0c;这些状态信息记录了每个Kafka的Broker服务与另外的Broker服务 有什么不同。通过这些差异化的功能&#xff0c;共同体现出集群化的业务能力。这些数据&#xff0c;需要在集群中各个…

DS二分查找_搜索二维矩阵(纯二分查找写法)

本题我写了两个方法&#xff0c;一个是的时间复杂度,就是本文章一个mn时间复杂度&#xff0c;这个比较简单&#xff0c;如果不会二分法可以看这篇文章 Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性&#xff1a; 1. 每行中的整数…

智物发布MT6877平台无线AR智能眼镜参考设计,推动下一代无线AR发展

随着增强现实(AR)技术的不断发展&#xff0c;有线AR眼镜在连接和使用方面存在一些限制。为了解决这些问题&#xff0c;无线AR智能眼镜的推出势在必行。 新一代无线AR智能眼镜采用了天玑900&#xff08;MT6877&#xff09;平台作为参考设计&#xff0c;搭载了2.4GHz的八核处理器…

【每日一题】用邮票贴满网格图

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;二维前缀和二维差分 写在最后 Tag 【二维前缀和】【二维差分】【矩阵】【2023-12-14】 题目来源 2132. 用邮票贴满网格图 题目解读 在 01 矩阵中&#xff0c;判断是否可以用给定尺寸的邮票将所有 0 位置都覆盖住&…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统&#xff0c;虚拟惯性和下垂控制&#xff0c;也可加入虚拟同步机VSG控制&#xff0c;飞轮储能容量可调&#xff0c;系统频率50Hz&#xff0c;离散模型&#xff0c;仿真运行速度快。 飞轮储能变流器采用双PWM环设计&#xff0c;并网电压电…

CleanMyMac2024绿色免费激活码序列号

2024CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志…