hot100 之移动零-283(双指针)
今日算法题:
题目
题解
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""slow = 0for fast in range(len(nums)):if nums[fast] != 0:nums[fast],nums[slow] = nums[slow],nums[fast]slow += 1
核心思路
要求:
给定一个数组 nums
,你要把所有的 0
挪到末尾。
同时保持非零元素的相对顺序不变。
要求 原地修改数组(in-place),不能新建一个数组。
我们可以用 双指针:
一个指针
slow
:存的是0的位置。一个指针
fast
:用来遍历数组。
遍历数组时:
slow
初始化的值是0fast
如果指到 0,就跳过。既不交换也不增加slow
的值如果遇到非零元素
就把它交换到
slow
位置(因为slow
位置还在开头)然后
slow
往前移动一格,(如果fast
指到0元素slow
将不会增加,直到fast
指到需要交换的非0元素)
这样最后数组前半部分都是非零元素,后面自动就变成 0 了(因为我们把 0 往后交换)
体现知识点
双指针
过程困难
逻辑问题:
理解困难
编译时的语法问题:
nums[fast],nums[slow] = nums[slow],nums[fast]
Python 支持“同时赋值”,这行就是交换 nums[slow]
和 nums[fast]
的值。
如果 slow == fast
,其实就是自己赋值自己,相当于啥也没发生。
优化解法
最优解