283. 移动零 双指针法+排序法

Lan
Lan
2023-01-15 / 0 评论 / 77 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年01月15日,已超过678天没有更新,若内容或图片失效,请留言反馈。

www.lanol.cn

题目

给定一个数组 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

进阶:你能尽量减少完成的操作次数吗?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

双指针法

这个方法嘞,依旧是快慢指针,一个指针用来遍历,一个指针用来记录非零元素的位置。
大概就是一个这样的过程:
快指针一直往前走,如果遇到非零元素,就直接赋值给慢指针,然后慢指针+1
这样一直执行下去,所有的非零元素都到了最前面。
这时候,我们需要将后面的元素清零。
我这边直接放在一个循环了。

from typing import List


class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        if nums:
            fast, slow, length = 0, 0, len(nums)
            while fast < length or slow < length:
                if fast != length:
                    if nums[fast] != 0:
                        nums[slow] = nums[fast]
                        slow += 1
                    fast += 1
                elif slow < length:
                    nums[slow] = 0
                    slow += 1


Solution().moveZeroes([0, 1, 0, 3, 12])

排序法

刚刚看了下,我在2020年居然提交过这道题,一行解决。。。
效率和上面方法差不多。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        nums.sort(key=bool,reverse=True)
0

评论 (0)

取消