返回

LeetCode 26:巧用O(1)复杂度去除排序数组中重复项

前端

LeetCode 26 题解

给定一个排序数组,要求我们原地修改数组,删除重复出现的元素,并返回删除后数组的新长度。题目要求我们不能使用额外的数组空间,这意味着我们必须在原数组上进行操作。这给我们带来了很大的挑战,因为我们在删除元素时可能会破坏数组的顺序。

算法思路

为了解决这个问题,我们可以采用一种叫做「双指针」的技巧。双指针法使用两个指针来遍历数组,一个指针用来记录当前位置,另一个指针用来记录当前值是否重复。

具体步骤如下:

  1. 定义两个指针 ij,分别初始化为 0 和 1。
  2. 循环遍历数组,当 nums[j] 不等于 nums[j-1] 时,将 nums[i] 的值设置为 nums[j] 并将 i 加 1。
  3. 重复步骤 2,直到 j 指针到达数组末尾。
  4. 返回 i 的值,即为删除重复元素后数组的新长度。

代码示例

def remove_duplicates(nums):
  """
  原地删除数组中重复的元素,并返回删除后数组的新长度。

  参数:
    nums: 待处理的数组

  返回值:
    删除重复元素后数组的新长度
  """
  if not nums:
    return 0

  i = 0
  j = 1
  while j < len(nums):
    if nums[j] != nums[j-1]:
      i += 1
      nums[i] = nums[j]
    j += 1

  return i + 1


# 测试代码
nums = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
new_length = remove_duplicates(nums)
print(f"删除重复元素后数组的新长度为:{new_length}")
print(f"删除重复元素后的数组为:{nums[:new_length]}")

输出:

删除重复元素后数组的新长度为:5
删除重复元素后的数组为:[1, 2, 3, 4, 5]

时间复杂度

双指针法的时间复杂度为 O(n),其中 n 为数组的长度。这是因为双指针法需要遍历数组一遍,时间复杂度与数组的长度成正比。

空间复杂度

双指针法的空间复杂度为 O(1)。这是因为双指针法只使用了两个指针来遍历数组,而这两个指针只占用常数空间。因此,双指针法的空间复杂度不受数组长度的影响。

总结

LeetCode 26 题要求我们原地修改数组,删除重复出现的元素,并返回删除后数组的新长度。本篇博客介绍了双指针法来解决这个问题,双指针法的思想是使用两个指针来遍历数组,一个指针用来记录当前位置,另一个指针用来记录当前值是否重复。

双指针法的优点是时间复杂度为 O(n),空间复杂度为 O(1)。这使得双指针法非常适合于解决这类需要原地修改数组的问题。