Leetcode283.移动零

该博客介绍了LeetCode第283题——移动零的解决方案。通过双指针方法,保持非零元素的相对顺序,将数组中的所有0移动到末尾。文章详细阐述了思路,即利用左右指针,左指针left记录非零元素的结束位置,右指针right遍历数组,当遇到非零元素时交换nums[left]与nums[right],然后left右移。最后,文章分析了时间复杂度为O(n),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode283.移动零

题目地址

283.移动零

题目详情

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

示例

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

说明

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

思路

借鉴快速排序的思想,使用双指针方法来实现:left、right指针初始在数组0位置。left表示[0,left)这个区间中数字都不为0,right负责遍历整个数组。为了保证非零元素的相对顺序,当right指向非零元素时,需要进行nums[left]与nums[right]两个元素互换,随后left移动一位。

也可以这么理解,将数组中所有非零元素按照相对顺序保留在[0,left)区间中,而[left, right)中则是数组中的非零元素。

实现代码

func moveZeroes(nums []int)  {
    // 数组为空,则直接返回
    if len(nums) == 0 {
        return
    }
    // 定义左右指针和数组长度
    left, right, lens := 0, 0, len(nums)
    // 遍历数组
    for right < lens {
        // 如果遇到非零元素,则包含在[0,left)区间中
        if nums[right] != 0 {
            nums[left], nums[right] = nums[right], nums[left]
            left++
        }
        // 遍历数组
        right++
    }
}

复杂度分析

时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。

空间复杂度:O(1)。只需要常数的空间存放若干变量。
参考
Leetcode题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值