前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 移动零

Leetcode 移动零

作者头像
月梦@剑心
发布2023-08-31 10:55:05
1020
发布2023-08-31 10:55:05
举报
文章被收录于专栏:月梦·剑心的技术专栏

移动零

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

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

我的思路

双指针,首先删掉零,慢指针遇到零就停下,快指针遇到零就跳过,随后将快指针索引的值赋值给慢指针,当快指针移动至数组尾,将慢指针之后的元素全部赋值为0,解决问题。

代码

代码语言:javascript
复制
func moveZeroes(nums []int)  {
    fastP, lowP := 0, 0
    for fastP < len(nums) {
        for fastP < len(nums) && nums[fastP] == 0 {
            fastP++
        }
        if fastP == len(nums) {
            break
        }
        nums[lowP] = nums[fastP]
        fastP++
        lowP++
    }
    for lowP < len(nums) {
        nums[lowP] = 0
        lowP++
    }
}

性能

代码语言:javascript
复制
执行用时:32 ms, 在所有 Go 提交中击败了13.23%的用户
内存消耗:6.5 MB, 在所有 Go 提交中击败了18.44%的用户
通过测试用例:74 / 74

由于数组的每个位置都要进行赋值操作,因此性能较差。

题解

双指针,慢指针遇到元素是0则停下,快指针跳过所有0值,将快慢指针所指元素交换;继续往后遍历,重复上述过程,直到快指针走至数组尾。 由于大大减少了赋值次数,因此时间复杂度有较大提升。

代码语言:javascript
复制
func moveZeroes(nums []int)  {
    fastP, lowP := 0, 0
    for fastP < len(nums) {
        if nums[lowP] ==0 {
            for fastP < len(nums) && nums[fastP] == 0 {
                fastP++
            }
            if fastP == len(nums) {
                break
            }
            nums[lowP], nums[fastP] = nums[fastP], nums[lowP]
        }
        fastP++
        lowP++
    }
}

性能:

代码语言:javascript
复制
执行用时:20 ms, 在所有 Go 提交中击败了72.32%的用户
内存消耗:6.5 MB, 在所有 Go 提交中击败了18.44%的用户
通过测试用例:74 / 74
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 移动零
  • 我的思路
  • 题解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档