力扣代码学习日记五

Problem: 283. 移动零

文章目录

思路

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

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

示例 1:

复制代码
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

复制代码
输入: nums = [0]
输出: [0]

提示:

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

解题方法

  1. 可以使用双指针的方法来实现这个功能。一个指针用于遍历数组,另一个指针用于记录当前非零元素应该放置的位置。遍历数组时,将非零元素依次移到非零指针指向的位置,然后将非零指针后面的元素置为零。
  2. 除了双指针法和逐个移动非零元素到数组前面的方法外,还可以使用一种更简单的方法,即"零元素交换法"。具体步骤如下:
  • 使用一个指针 non_zero_pointer 来记录当前非零元素应该存放的位置。
  • 遍历数组,当遇到非零元素时,将其与 non_zero_pointer 指向的位置进行交换,并将 non_zero_pointer 后移一位。
    这种方法的优点是不需要额外的循环来将剩余位置置为零,只需要一次遍历数组即可完成操作。

复杂度

时间复杂度:

  • 遍历数组的时间复杂度为O(n),其中n是数组的长度。
  • 第一个循环中的每个操作都是O(1)的时间复杂度,总体时间复杂度为O(n)。

空间复杂度:

  • 函数中使用了一个额外的非零指针 non_zero_pointer,以及一个循环中的临时变量 i,它们都是O(1)的空间复杂度。
  • 总体空间复杂度为O(1)。

代码

解法一:

python 复制代码
class Solution(object):
    def moveZeroes(self, nums):
        non_zero_pointer = 0

        for i in range(len(nums)):
            if nums[i] != 0:
                nums[non_zero_pointer] = nums[i]
                non_zero_pointer += 1

        for i in range(non_zero_pointer,len(nums)):
            nums[i] = 0

解法二:

python 复制代码
class Solution(object):
    def moveZeroes(self, nums):
        non_zero_pointer = 0

        for i in range(len(nums)):
            if nums[i] != 0:
                nums[non_zero_pointer], nums[i] = nums[i] ,nums[non_zero_pointer]
                non_zero_pointer += 1
相关推荐
星幻元宇VR1 小时前
VR机动车模拟驾驶系统助力交通安全科普
科技·学习·安全·生活·vr
FakeOccupational6 小时前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
ZhengEnCi8 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
贾斯汀玛尔斯8 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
大龄程序员狗哥8 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add38 小时前
质数相关知识
算法
南境十里·墨染春水8 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
小辉同志9 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
nashane9 小时前
HarmonyOS 6学习:旋转动画优化与长截图性能调优——打造丝滑交互体验的深度实践
学习·交互·harmonyos·harmonyos 5
小O的算法实验室10 小时前
2025年IEEE TITS,基于矩阵的进化计算+面向无线传感器网络数据收集无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进