返回

「双指针」LeetCode 26. 删除有序数组中的重复项(简单)

前端

题目概述

题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 。返回删除后数组的新长度。

说明:

  • 为了解决该问题,您不得将数组中的元素分配到另一个数组中。您必须 原地 修改输入数组并在使用后返回它。

示例:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1 和 2。不需要考虑数组中超出新长度的部分。

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5,并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 和 4。不需要考虑数组中超出新长度的部分。

双指针法

对于如何从有序数组中删除重复项,最常见的解决方法之一就是使用双指针法 。双指针法是一种在数组中移动两个指针来跟踪不同元素的技术,它通常用于解决各种数组问题。在解决本问题时,我们可以使用两个指针 ij

算法步骤:

  1. 将指针 ij 都初始化为 0
  2. 比较 nums[i]nums[j]
  3. 如果 nums[i]nums[j] 相等,则将 j 向右移动一位。
  4. 如果 nums[i]nums[j] 不相等,则将 nums[i+1] 设置为 nums[j],并将 ij 都向右移动一位。
  5. 重复步骤 2 到 4,直到 j 达到数组的末尾。
  6. 返回 i+1,它代表了新数组的长度。

代码示例:

def removeDuplicates(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(n)。
  • 空间复杂度:O(1)。双指针法不需要额外空间,因此空间复杂度为 O(1)。

总结

使用双指针法,我们可以轻松地从有序数组中删除重复项。这种方法不仅高效,而且易于理解和实现。通过本文,我们不仅学习了双指针法在数组问题中的应用,还了解了如何使用该算法解决 LeetCode 26. 删除有序数组中的重复项这一具体问题。