数组题总结

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

法一:统计0元素

nums=[1,2,0,3,9,0,]
def MoveZeroes(self):
        """
        Do not return anything, modify nums in-place instead.
        """
        # 循环记录0元素的个数,并且遇到非0元素时候,将非0元素替换到0元素的位置
        # count 记录0元素的个数, i - count实际上是记录了零元素的位置。
        count = 0
        for i in range(len(nums)):
            if nums[i] == 0:
                count += 1
            elif count > 0:
                nums[i - count], nums[i] = nums[i], 0
        return nums

output=MoveZeroes(nums)
print(output) 

复杂度分析:时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作

法二:双指针滑动,交换非零元素和零元素的位置

class Solution:
    def moveZeroes(self,arg) :
        # 循环遍历数组,当遇到非零元素则开始交换慢指针所指的0元素
        # i 为慢指针 指向最新一个0元素的位置
        i = 0
        for j in range(len(nums)):
            if nums[j] != 0:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1

        return nums

nums=[1,2,0,3,9,0]
output=Solution()
print(output.moveZeroes(nums))

>>>[1, 2, 3, 9, 0, 0]
改成[1, 2, 8, 3, 9, 0]
print一下打印出中间的num[i],num[j]可得
2
1
======
8
2
======
3
8
======
9
3
======
0
9
======
0
0
======
[1, 2, 8, 3, 9, 0]

Process finished with exit code 0

快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作

法三:非零元素替换零元素法

class Solution:
    def moveZeroes(self,arg) :
        # 循环遍历数组,当遇到非零元素则开始交换慢指针所指的0元素
        # i 为慢指针 指向最新一个0元素的位置
        j = 0
        for i in range(len(nums)):
            if nums[i] != 0:
                nums[j] = nums[i]
                if i != j:
                    nums[i] = 0
                j += 1
            print(nums[i])
            print(nums[j])
            print('======')

        return nums

nums=[1,2,8,3,9,0]
output=Solution()
print(output.moveZeroes(nums))
>>>
1
2
======
2
8
======
8
3
======
3
9
======
9
0
======
0
0
======
[1, 2, 8, 3, 9, 0]
但凡中间出现0 就会后面全部变成0
如:
2
1
======
0
2
======
0
0
======
0
0
======
0
0
======
0
0
======
[1, 2, 3, 9, 0, 0]


时间复杂度:O(n),假设有n个元素需要遍历n次
空间复杂度:O(1),只是对原数组进行替换操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值