返回

LeetCode刷题从入门到精通:01. 删除数组中的重复项

前端

在算法题的海洋中,LeetCode脱颖而出,成为程序员修炼内功的必经之路。今天,我们开启LeetCode刷题之旅的第一站——01. 删除数组中的重复项。我们将用通俗易懂的语言,带你领略算法题的魅力,同时锻炼你的编程思维。

问题

给你一个整数数组 nums,请你将数组中的重复元素删除,并返回新的数组。

示例 1:

输入:nums = [1, 1, 2]
输出:[1, 2]

示例 2:

输入:nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
输出:[0, 1, 2, 3, 4]

思路分析

为了解决这个问题,我们可以使用双指针技巧。具体思路如下:

  • 设置两个指针 i 和 j,初始值均为 0。
  • 比较 nums[i] 和 nums[j] 的值。
  • 如果 nums[i] 和 nums[j] 的值相等,则将 j 向后移动一位。
  • 如果 nums[i] 和 nums[j] 的值不相等,则将 nums[i] 处的元素原地复制一遍,然后将 i 和 j 都向后移动一位。

代码实现

def remove_duplicates(nums):
  """
  :type nums: List[int]
  :rtype: int
  """

  i = 0

  for j in range(1, len(nums)):
    if nums[i] != nums[j]:
      i += 1
      nums[i] = nums[j]

  return i + 1

时间复杂度

该算法的时间复杂度为 O(n),其中 n 是数组 nums 的长度。

空间复杂度

该算法的空间复杂度为 O(1),因为我们没有使用任何额外的空间。

优化技巧

为了节省空间,我们可以直接在原数组上进行修改。具体思路如下:

  • 设置一个指针 i,初始值为 0。
  • 遍历数组 nums,如果 nums[i] 与 nums[i-1] 的值相等,则跳过 nums[i];否则,将 nums[i] 处的元素原地复制一遍。
  • 返回 i。

代码实现

def remove_duplicates(nums):
  """
  :type nums: List[int]
  :rtype: int
  """

  i = 0

  for num in nums:
    if i == 0 or num != nums[i-1]:
      nums[i] = num
      i += 1

  return i

时间复杂度

该算法的时间复杂度为 O(n),其中 n 是数组 nums 的长度。

空间复杂度

该算法的空间复杂度为 O(1),因为我们没有使用任何额外的空间。