[leetcode刷题]面试经典150题之4删除有序数组中的重复项II(中等)

思路大致跟上一题一样

题目

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

不要使用额外的数组空间,你必须在 原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

解决思路:

  1. 双指针法:可以使用两个指针,一个用于遍历数组,另一个用于跟踪新数组中允许的唯一元素的位置。
  2. 保持最多两次重复:由于数组是有序的,我们只需要关注每个元素的出现次数是否大于 2 次。因此,对于每个元素,允许其最多出现两次。

具体步骤:

  1. 使用两个指针 ij

    • i:是慢指针,表示当前数组中有效元素的最后一个位置。
    • j:是快指针,用于遍历数组。
  2. 初始化 i = 1,表示前两个元素无论如何都需要保留,因为我们允许元素最多出现两次。

  3. 从第三个元素(j = 2)开始遍历数组:

    • 如果当前元素 nums[j] 不等于 nums[i-1],说明它与前两个元素不同或者第一次遇到这个元素,我们可以将其放到 nums[i+1] 位置。
    • 如果相等,则跳过这个元素。
  4. 遍历结束后,i+1 就是最终数组的长度。

代码

复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) <= 2:  # 如果数组长度小于等于2,直接返回长度
            return len(nums)
        
        i = 1  # 慢指针,指向有效数组的末尾
        for j in range(2, len(nums)):  # 快指针,从第三个元素开始遍历
            if nums[j] != nums[i-1]:  # 如果当前元素与nums[i-1]不同
                i += 1  # 移动慢指针
                nums[i] = nums[j]  # 更新有效数组
        
        return i + 1  # 返回数组长度
相关推荐
CodeWizard~15 分钟前
AtCoder Beginner Contest 430赛后补题
c++·算法·图论
大大dxy大大25 分钟前
机器学习-KNN算法示例
人工智能·算法·机器学习
007php0071 小时前
某游戏互联网大厂Java面试深度解析:Java基础与性能优化(一)
java·数据库·面试·职场和发展·性能优化·golang·php
关于不上作者榜就原神启动那件事1 小时前
模拟算法乒乓球
开发语言·c++·算法
Bug退退退1232 小时前
ArrayList 与 LinkedList 的区别
java·数据结构·算法
狂炫冰美式2 小时前
QuizPort 1.0 · 让每篇好文都有测验陪跑
前端·后端·面试
88号技师2 小时前
2025年7月一区SCI优化算法-Logistic-Gauss Circle optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
沐怡旸2 小时前
【底层机制】垃圾回收(GC)底层原理深度解析
android·面试
Moonbit3 小时前
MoonBit Pearls Vol.12:初探 MoonBit 中的 Javascript 交互
javascript·后端·面试
沐怡旸3 小时前
【穿越Effective C++】条款13:以对象管理资源——RAII原则的基石
c++·面试