返回

用两种方法巧妙应对 LeetCode 26:删除有序数组中的重复项,效率大幅提升

前端

算法练习系列 26:LeetCode26——删除有序数组中的重复项

1. 循环法

1.1 概述

循环法是一种直接的方法,可以有效地删除有序数组中的重复项。

1.2 代码实现

def remove_duplicates(nums):
    # 初始化一个新数组,用于存储不包含重复项的元素。
    unique_nums = []

    # 遍历给定数组。
    for num in nums:
        # 如果当前元素不在新数组中,则将其添加到新数组中。
        if num not in unique_nums:
            unique_nums.append(num)

    # 返回新数组。
    return unique_nums

1.3 时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 为给定数组的长度。
  • 空间复杂度:O(n),因为我们创建了一个新数组来存储不包含重复项的元素。

2. 双指针法

2.1 概述

双指针法是一种更有效的方法,可以删除有序数组中的重复项。

2.2 代码实现

def remove_duplicates(nums):
    # 初始化两个指针,slow 和 fast。slow 指针指向当前不包含重复项的元素,而 fast 指针遍历给定数组。
    slow = 0
    fast = 1

    # 遍历给定数组。
    while fast < len(nums):
        # 如果当前元素与前一个元素不同,则将当前元素移动到 slow 指针指向的位置。
        if nums[fast] != nums[slow]:
            slow += 1
            nums[slow] = nums[fast]

        # 移动 fast 指针。
        fast += 1

    # 返回不包含重复项的数组。
    return nums[:slow + 1]

2.3 时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 为给定数组的长度。
  • 空间复杂度:O(1),因为我们没有创建新的数组来存储不包含重复项的元素。

3. 比较

循环法和双指针法都可以有效地删除有序数组中的重复项。然而,双指针法通常更有效,因为它只需要遍历数组一次,而循环法需要遍历数组两次。此外,双指针法不需要额外的空间来存储不包含重复项的元素,而循环法需要。