是让我们将给定数组里的0都放到数组的末尾,然后还要保持非0元素的顺序不变。也不可以复制数组,尽量少操作次数。
最初想的是遇到为0的就pop,然后在尾部append,但是这样如果外面的循环是for的话,那么每次i都增加了,可能你删除第一个之后新成为第一个的原第二个还是0,就没有删除。那么用while的话,一旦后几个全是0的时候就跳不出while了,所以time limited。
重新考虑,这次考虑互换,想找到为0的之后,找到离他最近的不为0的数,然后互换,这样就可以保证互换过来的不是0,并且也保留了原顺序。那么说干就干
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
for i in range(len(nums)):
if(nums[i] == 0):
index = i+1
while(index < len(nums) and nums[index] == 0):
index += 1
if(index < len(nums)):
nums[i] = nums[index]
nums[index] = 0
但是呢,这个复杂度取决于0的多少,貌似是这样的,O(n*k)k是0的个数,所以最差也许有O(n^2)
所以继续!
其实换一种思路就是找到不为0的依次放到0,1,2…的位置就可以了,这样需要维持两个points,前一个其实就是不为0的个数,后面的就是为了遍历。然后再从不为0的后一个开始,全部置为0就行啦
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
point = 0
for i in range(len(nums)):
if nums[i]:
nums[point] = nums[i]
point += 1
while(point < len(nums)):
nums[point] = 0
point += 1
后来又在别人那里看到了更为简洁的,也是这种两个points的想法,但是找到不是0的直接和前面的交换,这样后面的就自动都是0了,不需要再赋值一遍了
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
point = 0
for i in range(len(nums)):
if nums[i]:
nums[point] , nums[i] = nums[i], nums[point]
point += 1
然后我发现还是只能打败40%的人,我就不知道还能怎样啦,不过听说这个跟leetcode那边服务器的状态也是有关的,我就不打算管他啦