时间:2020-05-28
题目地址:https://leetcode-cn.com/problems/move-zeroes/
题目难度:Easy
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
思路1:第一反应是找到非0数和前边的0交换位置,不知道咋写,就放弃了,我==。这其实是用了快排的思想,以0位基准,不等于0的放左边,等于0的放右边
代码段1:通过
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
j = 0
for i in range(len(nums)):
if(nums[i] != 0):
nums[j], nums[i] = nums[i], nums[j]
j += 1
总结:
- 再次优化,不再重复交换i j同一位的情况,同时用赋值代替交换。上个代码段和优化后的执行时间和内存消耗分别是40 ms 14.4 MB | 36 ms 14.3 MB
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
j = 0
for i in range(len(nums)):
if(nums[i] != 0):
if(i > j):
nums[j] = nums[i]
nums[i] = 0
j += 1
思路2:统计0的个数,删除所有的0,在列表尾部加上相应个数的0
代码段2:通过
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
_temp = nums.count(0) # 原始长度
while(_temp):
nums.remove(0)
nums.append(0)
_temp -= 1
总结:
- remove()方法删除列表特定值的元素,只删除一个
- 我写的和简洁版本的运行时间和空间消耗分别为:104 ms 14.4 MB | 92 ms 14.2 MB
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(nums.count(0)):
nums.remove(0)
nums.append(0)
本文详细解析了LeetCode上的“Move Zeroes”题目,提供了两种不同的解决方案,包括使用快排思想进行原地交换的高效方法,以及通过统计零元素数量并重新构造数组的方法。对比了不同解法的时间和空间复杂度。
2万+

被折叠的 条评论
为什么被折叠?



