美文网首页
283. Moving Zeros 经典数组问题的三个解法

283. Moving Zeros 经典数组问题的三个解法

作者: 4v3r9 | 来源:发表于2019-01-16 10:25 被阅读8次

    题目描述见 https://leetcode.com/problems/move-zeroes/

    方法一

    非in-place算法:
    首先数一下数组中有多少个0 (遍历一次)
    然后把数组中非零元素复制到templist中(遍历一次)
    然后把templist尾部填充0,
    最后把templist覆盖到nums.

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution(object):
        def moveZeroes(self, nums):
            """
            :type nums: List[int]
            :rtype: void Do not return anything, modify nums in-place instead.
            """
            
            # method 1
            numzeros = 0
            n = len(nums)
            
            for ele in nums:
                if not ele:
                    numzeros +=1
            
            templist = []
            for ele in nums:
                if ele:
                    templist.append(ele)
            
            while numzeros:
                templist.append(0)
                numzeros -=1
                
            nums[:] = templist[:]
    

    方法二

    遍历nums,如果遇到非零元素就位置0开始复制到nums前面.使用一个指针标记复制序列的尾部.

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution(object):
        def moveZeroes(self, nums):
            """
            :type nums: List[int]
            :rtype: void Do not return anything, modify nums in-place instead.
            """
            
            # method 2
            pivot = 0
            
            for ele in nums:
                if ele:
                    nums[pivot] = ele
                    pivot +=1
            
            while pivot < len(nums):
                nums[pivot] = 0
                pivot +=1
    

    方法三

    维持两个指针p1 和 p2,其中p1是从nums[0]开始的非零序列的尾部.从头遍历数组,如果遇到非零元素就将它和前面p1指向的元素交换.由于存在零,最后自然把0都移到了数组末尾.

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution(object):
        def moveZeroes(self, nums):
            """
            :type nums: List[int]
            :rtype: void Do not return anything, modify nums in-place instead.
            """
            
            # method 3
            pivot1 = 0
            pivot2 = 0
            
            while pivot2 < len(nums):
                if nums[pivot2]:
                    #swap nums[p1] and nums[p2]
                    temp = nums[pivot1]
                    nums[pivot1] = nums[pivot2]
                    nums[pivot2] = temp
                    pivot1 +=1
                pivot2 +=1
    

    相关文章

      网友评论

          本文标题:283. Moving Zeros 经典数组问题的三个解法

          本文链接:https://www.haomeiwen.com/subject/skmpdqtx.html