Loading

Leetcode - 面试经典 150 题 - 删除有序数组中的重复项 II

题目:删除有序数组中的重复项 II

题目描述

类似 删除有序数组中的重复项,允许重复次数改为2。

示例 1:

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

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

题解

双指针

思路

依旧双指针方法,fast遍历数组检查每个元素,slow记录有效区域,不同的是判断条件,由于允许一次重复,因此关注点应该从 nums[fast - 1] 改成已经被记录的倒数第二个元素 nums[slow - 2],由于递增特性,若二者相等,则 nums[fast] 必然不再是前两次出现,因此应该被舍弃,若二者不相等,则 nums[fast] 至多被保留过一次,因此可以继续保留。

事实上,上一道题 中,更容易理解的写法应该是将本题中的 slow - 2 改成 slow - 1,将关注点放在对比已保留的元素和当前需要被定性的元素之间才是更普适的解法。

实现

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) <= 2:
            return len(nums)

        slow = 2
        for fast in range(2, len(nums)):
            if nums[slow - 2] != nums[fast]:
                nums[slow] = nums[fast]
                slow += 1
        
        return slow

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
posted @ 2025-11-17 14:44  SmoothWater  阅读(7)  评论(0)    收藏  举报