解决之路= =
题目描述
测试案例(部分)
第一次
看到这题目,第一时间还真想到了双指针法(暴力解法是个会写代码的都能第一时间想到,所以自己学会了尽量不第一时间用暴力解法)
right
的初始位置元素若为0
,那么right--
;left
如果是零,那就与right
互换位置,然后left++, right--
。
class Solution(object):
def moveZeroes(self, nums):
n = len(nums)
left = 0
right = n-1
while left < right:
if nums[right] == 0:
right -= 1
if nums[left] == 0:
temp = nums[left]
nums[left] = nums[right]
nums[right] = temp
right -= 1
left += 1
测试,不正确。看看题目,要求了保持非零序列的相对位置。自己的代码会导致乱序的。
第二次
关于这个乱序,自己学习排序算法时倒是有过类似内容,即是排序的稳定性。比如稳定的排序算法有插入排序、冒泡排序、归并排序、基数排序等。我们只需要把排序的规则改一改,改成和判断0有关的即可。
按照这个思路,基数排序不太合适,插入排序、冒泡排序时间复杂度O(n2)暂不考虑。可能归并可以试试。
但自己又突然想到了一个办法。找到0并不是只能交换处理,还可以删除,然后计数,在最后把0统一加上就好。
class Solution(object):
def moveZeroes(self, nums):
count = 0
while 0 in nums:
nums.remove(0)
count += 1
for i in range(count):
nums += [0]
测试正确,提交成功。
第三次
不过时间上还是有点慢的,看了下代码,好像可以优化一下,改一下代码。
class Solution(object):
def moveZeroes(self, nums):
res = []
while 0 in nums:
nums.remove(0)
res.append(0)
nums += res
改变不大
第四次
看看评论区怎么写的。
woc,看到一个好屌的代码。
学到了,排序原来还可以对bool
对象进行排序,只会判断是True还是False,数值具体是几都不管,相对位置也不会改变。
eg:[1, 0, 12, 3, 0]
按照bool来排序,得到的就是[0, 0, 1, 12, 3]
,1、12、3这三个为True的数值之间的相对位置不会发生改变。
然后设置升序还是降序,就可以控制0在列表前,还是0在列表后。
提交结果快的很,牛!