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