LC打怪录 冒泡排序 283. moving zero

本文介绍了两种处理数组中零元素的方法:使用双指针技巧的moveZeroes函数,其时间复杂度为O(n),以及基于BubbleSort的解决方案,尽管后者时间复杂度为O(n^2)。这两种方法都旨在将零元素移到数组末尾,同时保持非零元素的相对顺序。
摘要由CSDN通过智能技术生成

题目链接 力扣

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        l=0
        for r in range(len(nums)):
            if nums[r]:
                nums[l], nums[r] = nums[r], nums[l]
                l += 1
        return nums

方法一:

思路

双指针

1. def moveZeroes(self, nums: List[int]) -> None: 定义了一个名为moveZeroes的方法,该方法接受一个名为nums的整数列表作为参数。该方法的返回类型被指定为None,意味着这个方法不会返回任何值,而是直接在输入的nums列表上进行修改。

2. l=0 初始化一个名为l的变量,作为左指针(或“慢”指针),用于跟踪最近的非零元素应该被放置的位置。for r in range(len(nums)): 使用一个名为r的变量(右指针或“快”指针)遍历nums列表的所有索引。

3. if nums[r]: 检查当前r指向的元素是否非零。如果是非零元素,执行以下操作:

a. nums[l], nums[r] = nums[r], nums[l] 交换lr指向的元素。这实际上将非零元素移动到数组的前面,同时保持它们原有的相对顺序。

b. l += 1l(左指针)向右移动一位,因为我们刚刚在l的位置放置了一个非零元素,所以下一个可能的非零元素的位置应该是l + 1

4. return nums 虽然方法的返回类型被指定为None,但这里返回了修改后的nums列表。这不是必须的,因为nums列表是在原地被修改的,但这样做可以在测试或调试时方便查看方法的效果。

时间复杂度为:O(n)

方法2:

Bubble Sort

那怎么知道有序呢?其实很简单,就是第二层 for 循环的时候,没有交换的元素。

所以呢,这里就增加一个 flag 数组,如果第二层循环没有交换元素的时候,证明数组已经排序好了,不需要再继续遍历,直接返回就好了。


def bubbleSort(nums):
    # 数组长度
    n = len(nums)
    # 遍历数组中的元素(n 次冒泡操作)
    for i in range(n):
        # 标志位,检查是否发生元素交换
        flag = False
        # 每次冒泡操作中比较每个元素
        for j in range(n - i - 1):
            # 比较相邻元素大小(升序)
            if nums[j] > nums[j + 1]:
                # 如果左边大于右边,就交换顺序
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
                # 如果发生交换,证明还不是有序,继续遍历
                flag = True
        # 如果不发生交换,证明数组已经有序,直接跳出循环        
        if not flag:
            break
    # 返回数组            
    return nums

实现逻辑

  • 新代码通过比较相邻元素并在发现0时将其向后交换,逐步将0移动到数组的末端。这个过程在每一轮循环中都会重复,直到所有的0都被移动到末尾。
  • 之前的方法通过使用两个指针(一个快指针和一个慢指针)来避免不必要的比较和交换。当快指针指向的元素非0时,它会与慢指针指向的元素交换位置,然后慢指针前进一位。这样可以保证所有非0元素都被移动到数组的前面,而0则自然被留在了后面。

时间复杂度:O(n2)

  • 新代码的时间复杂度是O(n2),这是因为它使用了两层嵌套循环来遍历数组。对于每一个元素,它都会与其后面的元素进行比较并可能交换,这导致了较高的运算次数,特别是当数组较大时。 
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值