双指针题解——移动零【LeetCode】

283. 移动零

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

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

示例 1:

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

示例 2:

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

算法思路

核心目的是,将不是0的数字按照顺序依次交换到前面去

  1. 核心思想

    • 使用双指针 left 和 rightright 用于遍历数组,left 用于记录非零元素的位置。
    • 当 nums[right] 不为 0 时,将其与 nums[left] 交换,并将 left 右移。
    • 最终,所有非零元素会被移动到数组的前面,而所有 0 会被移动到数组的末尾。
  2. 具体步骤

    • 初始化两个指针 left 和 right 为 0。
    • 遍历数组:
      • 如果 nums[right] 不为 0,则交换 nums[left] 和 nums[right],并将 left 右移。
      • 无论是否交换,right 都右移。
    • 最终,数组中的所有 0 会被移动到末尾。
  3. 关键点

    • 通过交换操作,将非零元素移动到数组的前面,同时保持其相对顺序。
    • 时间复杂度为 O(n),空间复杂度为 O(1)
class Solution(object):
    def moveZeroes(self, nums):
        n = len(nums)  # 数组的长度
        left = right = 0  # 初始化两个指针 left 和 right

        while right < n:  # 遍历数组
            if nums[right] != 0:  # 如果当前元素不为 0
                nums[left], nums[right] = nums[right], nums[left]  # 交换 left 和 right 的元素
                left += 1  # 移动 left 指针
            right += 1  # 移动 right 指针

时间复杂度分析

  1. 遍历数组:使用 right 指针遍历数组,时间复杂度为 O(n)
  2. 交换操作:每次交换的时间复杂度为 O(1)
  3. 总时间复杂度O(n)

空间复杂度分析

  1. 原地操作:没有使用额外的空间,空间复杂度为 O(1)
  2. 总空间复杂度O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值