【数组】力扣283题:移动0
建议在看题目之前先了解数组的具体知识点,可以看这里:
算法基础(二):数组知识点及题型讲解。
其它题目:
【数组】力扣27题:移除元素
【数组】力扣26题:删除有序数组中的重复项
【数组】力扣80题:删除有序数组中的重复项 II
【数组】力扣75题:颜色分类
【数组】力扣485题:最大连续 1 的个数
力扣283题:移动0
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例2:
输入: nums = [0]
输出: [0]
解法一:我自己一开始的解法
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
# -> None的意思是什么都不返回,只在nums上面修改
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(len(nums)):
if nums[i] == 0:
nums.remove(nums[i])
nums.append(0)
结果:
执行用时:936 ms, 在所有 Python3 提交中击败了8.28%的用户
内存消耗:15.9 MB, 在所有 Python3 提交中击败了26.12%的用户
代码很容易理解,但在时间和空间复杂度上面都不理想。
解法二:更改索引
先设定一个索引为0,然后寻找第一个不为0的数,放在索引为0的位置,然后继续…(其实就是双指针法)
index = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[index] = nums[i] # 不为0的值放到当前的index上
index += 1
for i in range(index, len(nums)):
nums[i] = 0
结果:
执行用时:40 ms, 在所有 Python3 提交中击败了97.44%的用户
内存消耗:15.9 MB, 在所有 Python3 提交中击败了14.86%的用户
解法三:计算0的个数
计算0的个数,然后删除这么多个0,再加入这么多个0
for i in range(nums.count(0)):
nums.remove(0)
nums.append(0)
结果:
执行用时:572 ms, 在所有 Python3 提交中击败了14.77%的用户
内存消耗:15.9 MB, 在所有 Python3 提交中击败了31.81%的用户
解法四:大神解法
nums.sort(key=bool, reverse=True)
结果:
执行用时:32 ms, 在所有 Python3 提交中击败了99.93%的用户
内存消耗:15.9 MB, 在所有 Python3 提交中击败了22.56%的用户
bool类型就是对0和非0元素进行排序,在这个规则下,0为一种,非0为另外一种,所以 key=bool 之后的结果是[0,0,1,3,12],然后 reverse=True 反向排序,则变成了[1,3,12,0,0]
解法五:双指针
其实就是解法二
slow = fast = 0
for fast in range(len(nums)):
if nums[fast] != 0:
nums[slow] = nums[fast]
slow += 1
for i in range(slow, len(nums)):
nums[i] = 0
执行用时:48 ms, 在所有 Python3 提交中击败了81.41%的用户
内存消耗:15.8 MB, 在所有 Python3 提交中击败了46.04%的用户