283.移动零(py)

双指针法思路:27.移除元素(py)-CSDN博客

题目

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

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

题解

        先将所有非零元素按原始顺序 "收集" 到数组前面,再将数组剩余部分全部填充为 0。

        初始化一个慢指针slow,从数组起始位置开始,这个指针标记了下一个非零元素应该放置的位置;使用快指针fast遍历整个数组。

        当遇到非零元素时(nums[fast] != 0),将该元素复制到慢指针slow指向的位置,慢指针向前移动一位,准备接收下一个非零元素。这样,所有非零元素都会按原始顺序被依次放到数组前面。

        第一次遍历结束后,slow指针之前的位置都已经被非零元素占据,从slow位置开始到数组末尾,将所有位置填充为 0,因为slow之前已经有slow个非零元素,所以剩余的len(nums) - slow个位置都应该是 0。

LeetCode

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        slow = 0  # 慢指针,指向当前应该放置非零元素的位置
    
        # 第一次遍历:将所有非零元素按顺序放到前面
        for fast in range(len(nums)):
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
    
        # 第二次遍历:将剩余位置填充为0
        for i in range(slow, len(nums)):
            nums[i] = 0

        return nums

链接

283. 移动零 - 力扣(LeetCode)

时间:2025.6.11

不爱学习的大学生

你可能感兴趣的:(LeetCode,算法,python,leetcode)