返回

程序员进阶必备:LeetCode第80题删除有序数组中的重复项II

后端

删除有序数组中的重复项 II:双指针法详解

前言

各位程序员朋友们,大家好!今天,我们一起来学习 LeetCode 第 80 题:删除有序数组中的重复项 II。这道题是 LeetCode 中级题中的经典之作,解题思路巧妙,技巧独到,非常值得我们深入探讨。

题目

给定一个有序数组 nums,其中元素可以重复出现多次,请删除重复项,使得每个元素最多出现两次。

解题思路

这道题的解题思路十分巧妙,我们可以使用双指针法来解决。双指针法的基本原理如下:

  • 使用两个指针 leftright 来标记当前正在比较的两个元素。
  • 如果 leftright 指向的元素相同,则将 right 指针向右移动一位,直到找到一个与 left 指向的元素不同的元素。
  • right 指针指向的元素复制到 left 指针指向的元素处。
  • left 指针向右移动一位,并重复步骤 2 和步骤 3,直到 right 指针到达数组的末尾。

代码实现

def remove_duplicates(nums):
    if not nums:
        return 0

    # 使用双指针 left 和 right
    left = 0
    right = 0

    # 循环遍历数组
    while right < len(nums):
        # 如果 left 和 right 指向的元素相同
        if nums[left] == nums[right]:
            # 将 right 指针向右移动一位
            right += 1
        # 否则
        else:
            # 将 right 指针指向的元素复制到 left 指针指向的元素处
            nums[left + 1] = nums[right]
            # 将 left 指针向右移动一位
            left += 1
            # 将 right 指针指向 left 指针指向的元素处
            right = left + 1

    # 返回新的数组长度
    return left + 1

复杂度分析

  • 时间复杂度: O(n),其中 n 是数组的长度。
  • 空间复杂度: O(1),因为我们只需要使用两个额外的指针。

总结

这道题的解题思路巧妙,我们使用双指针法来解决,这种方法不仅高效,而且时间复杂度和空间复杂度都为 O(n)。希望小伙伴们能够通过这道题,掌握双指针法的使用方法,并在今后的编程中灵活运用。

互动提问

  1. 在实际项目中,你遇到过哪些需要使用双指针法来解决的问题?
  2. 你还知道哪些其他使用双指针法来解决的问题?
  3. 你对这道题的解题思路有什么其他的想法吗?

欢迎小伙伴们在评论区留言讨论,共同学习进步!

常见问题解答

  1. 为什么需要使用双指针法来解决这道题?
    双指针法可以有效地解决有序数组中的重复元素问题。通过使用两个指针,我们可以快速地定位重复元素,并将它们删除。

  2. 除了这道题,双指针法还可以用来解决哪些问题?
    双指针法广泛应用于各种数组问题,例如:

    • 查找两个有序数组的中位数
    • 合并两个有序链表
    • 寻找两个有序数组的交集和并集
    • 判断一个字符串是否是回文
  3. 这道题还有其他解题思路吗?
    除了双指针法,还可以使用哈希表来解决这道题。具体做法是,将每个元素作为哈希表的键,对应的出现次数作为哈希表的值。然后,遍历哈希表,只保留出现次数小于等于 2 的元素即可。

  4. 双指针法在实际项目中有哪些应用?
    双指针法在实际项目中有着广泛的应用,例如:

    • 寻找字符串中的最长回文子串
    • 在排序的日志文件中查找特定的最近日志记录
    • 在有序数组中查找两个数之和为目标值的索引
  5. 如何掌握双指针法?
    掌握双指针法需要大量的练习。建议小伙伴们多刷 LeetCode 上的双指针法相关题目,总结双指针法的使用技巧和适用场景。