当前位置: 首页 > news >正文

80. 删除有序数组中的重复项 II【 力扣(LeetCode) 】

一、题目描述

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

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

二、测试用例

示例 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. 基本思路:序列已经按照非严格递增的顺序排序,则重复的元素一定连续,则考虑用不需要删除的元素来填充需要删除的元素,来避免大量元素的移动。
  2. 具体思路:序列前两个元素一定不用删除,维护两个指针 i 和 k ,其中 i 初始化为 2,用于遍历序列,寻找不需要删除的元素;k 初始化为 1 ,用于存放不需要删除的元素。
    • 因为重复的元素一定连续,则如果指针 i 和指针 k 指向的元素不相同,说明该元素还没有保存,则指针 i 所指的元素是不用删除的,则将其保存给指针 k 。
    • 如果指针 i 和指针 k 指向的元素相同:
      • 如果指针 i 和指针 k-1 指向的元素不相同,说明该元素只保存了一次,所以该元素是不需要删除的,则将其保存给指针 k 。
      • 如果指针 i 和指针 k-1 指向的元素相同,说明该元素已经保存了两次了,则该元素需要删除。
    • 重复上述操作,直至遍历完序列为止。
  3. 扩展:需要删除重复元素且元素最多只能保存出现 x 次,则指针 i 与指针 k,k-1,… ,k-x+1 所指的元素不相同都是不需要删除的元素。【不知道算不算这一类问题的通解,嘿嘿!】

四、参考代码

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

int removeDuplicates(vector<int>& nums) {int n=nums.size();if(n<=2) return n;int k=1;for(int i=2;i<n;i++){if(nums[i]!=nums[k]||nums[i]!=nums[k-1])nums[++k]=nums[i];}return k+1;
}

测试结果:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • primeflex教学笔记20240720, FastAPI+Vue3+PrimeVue前后端分离开发
  • 第三届智能机械与人机交互技术学术会议(IHCIT 2024)
  • html+css+js前端作业 王者荣耀官网5个页面带js
  • Web前端Promise
  • 【JavaScript】点击穿透
  • 爬虫学习4:爬取王者荣耀技能信息
  • 高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建
  • 前端切片下载
  • react开发-配置开发时候@指向SRC目录
  • 微服务概念篇-服务提供者/服务消费者
  • 案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系
  • react中配置路径别名@
  • 使用docker部署后端项目后,拿不到linux中的文件
  • 【python】Numpy中的ValueError: setting an array element with a sequence报错分析及解决方案
  • 逻辑漏洞面试问题
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas 绘制双线技巧
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • express + mock 让前后台并行开发
  • Shadow DOM 内部构造及如何构建独立组件
  • Shell编程
  • SQLServer插入数据
  • Vue.js源码(2):初探List Rendering
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用Gradle第一次构建Java程序
  • 通过git安装npm私有模块
  • 网页视频流m3u8/ts视频下载
  • 消息队列系列二(IOT中消息队列的应用)
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ionic异常记录
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #etcd#安装时出错
  • (160)时序收敛--->(10)时序收敛十
  • (2)nginx 安装、启停
  • (3)(3.5) 遥测无线电区域条例
  • (C++17) std算法之执行策略 execution
  • (done) 两个矩阵 “相似” 是什么意思?
  • (WSI分类)WSI分类文献小综述 2024
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)模仿学习-完成后台管理页面查询
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (源码分析)springsecurity认证授权
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 给NuGet包添加Readme
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?