返回

LeetCode 26:巧解排序数组去重——深入浅出的 Python 实现

人工智能

导言

在计算机科学中,算法是解决特定问题的明确指令序列。LeetCode 是一个广受欢迎的在线平台,提供各种算法挑战,帮助程序员磨练他们的技能。LeetCode 26 题考察了数组去重的经典问题,即如何从一个已排序的数组中移除所有重复元素。

问题

LeetCode 26 题的具体如下:

给定一个已排序的数组 nums,请原地删除所有重复元素,并返回新数组的长度。

要求

  • 必须直接对 nums 数组进行修改,不得使用额外的数组。
  • 算法时间复杂度应为 O(n),其中 n 是数组 nums 的长度。
  • 空间复杂度应为 O(1)。

巧妙解法

解决 LeetCode 26 题的关键在于巧妙利用数组的排序特性。我们定义两个指针 slowfast,初始都指向数组的第一个元素。slow 指针负责记录去重后的元素,而 fast 指针则遍历整个数组,寻找不同的元素。

def remove_duplicates(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    if not nums:
        return 0

    slow = fast = 0

    while fast < len(nums):
        if nums[fast] != nums[slow]:
            slow += 1
            nums[slow] = nums[fast]
        fast += 1

    return slow + 1

算法流程

  • 初始化指针:slowfast 指针都初始化为 0。
  • 遍历数组: 使用 while 循环,在 fast 指针未到达数组末尾时持续遍历。
  • 比较元素: 比较 nums[fast]nums[slow] 的值。如果不同,则将 nums[slow] 的值更新为 nums[fast],并将 slow 指针后移。
  • 后移 fast 指针: 无论是否更新 nums[slow],都将 fast 指针后移一位。
  • 返回结果: 循环结束后,返回 slow 指针的位置,即去重后数组的长度。

分析

时间复杂度:

该算法的时间复杂度为 O(n),其中 n 是数组 nums 的长度。while 循环最多执行 n 次,每次循环内执行的语句都是常数时间的操作。

空间复杂度:

该算法只需要两个指针变量 slowfast,因此空间复杂度为 O(1)。

代码示例

nums = [1, 1, 2, 3, 3, 4, 4, 5, 5, 6]
result = remove_duplicates(nums)
print(result)  # 输出:6

总结

LeetCode 26 题的数组去重问题看似简单,但其解题的关键在于巧妙地利用数组的排序特性。通过双指针法,我们可以高效地原地修改数组,移除所有重复元素,而无需占用额外的空间。本文详细讲解了算法的原理、代码实现和复杂度分析,帮助读者深入理解这一经典算法题。