https://leetcode.cn/problems/move-zeroes/description/
小白思想
思想上还是首先开一个指针i,i从左到右扫每一个元素,i每发现一个0,就把这个0推到最后,这样i到最后就可以了。
这个和删除元素那个题解的小白思想和一模一样,只不过把val
换成0
,把元素交换更换成把元素推向最后的push_end
就行了。代码我就不写了。。
def push_end(nums,left,right): # 按次序把left位置上的元素推到right位置dummy=nums[left]tmp=leftwhile tmp+1<=right:nums[tmp]=nums[tmp+1]tmp+=1 nums[right]=dummyreturn nums
因为小白思路简单直白但是代码写起来很啰嗦。
技巧
这是要记住的知识点!
脑中脑中迅速闪过几个关键词:数组、数组划分部分、双指针 ======> 考虑快慢指针。
一般使用起来都是O(n),结束条件几乎都是快指针遍历结束,慢指针恰好在边界。不同点是慢指针的条件各不相同。
根据小白解法,我们让快指针去指向判定当前元素是否能进入左侧要保留部分的位置,慢指针指向保留部分的最后一个位置。也就是快指针做条件判断,慢指针做位置标识。
那么用什么条件作为快指针条件呢?
回归题意,我们希望左侧的都是不等于0,这样只要nums[fast]!=val,就可以把fast元素放到左侧了。
class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""slow=0for fast in range(len(nums)):if nums[fast]!=0:# swaptmp=nums[fast]nums[fast]=nums[slow]nums[slow]=tmpslow+=1
这样写起来非常简洁,而且还能保持原先数组的顺序。小白看了都哭了……