删除有序数组中的重复项 II[中等]

优质博文:IT-BLOG-CN
在这里插入图片描述

一、题目

给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。

说明: 为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}

示例 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已按升序排列

二、代码

思路: 因为给定数组是有序的,所以相同元素必然连续。我们可以使用双指针解决本题,遍历数组检查每一个元素是否应该被保留,如果应该被保留,就将其移动到指定位置。具体地,我们定义两个指针slowfast分别为慢指针和快指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度,即nums[fast]表示待检查的第一个元素,nums[slow−2]为上上一个应该被保留的元素所移动到的指定位置。判断nums[slow−2]是否和当前待检查元素nums[fast]相同。当且仅当nums[slow−2]=nums[fast]时,当前待检查元素nums[fast]不应该被保留(因为此时必然有nums[slow−2]=nums[slow−1]=nums[fast]。最后slow即为处理好的数组的长度。

特别地,数组的前两个数必然可以被保留,因此对于长度不超过2的数组,我们无需进行任何处理,对于长度超过2的数组,我们直接将双指针的初始值设为2即可。

class Solution {public int removeDuplicates(int[] nums) {// 思路:定义快慢两个指针fast slow 当 fast == fast - 2 时,替换掉当前元素if (nums.length < 3) {return 2;}int slow = 2, fast = 2;while (fast < nums.length) {// 这里需要用slow去-2if (nums[slow - 2] != nums[fast]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;}
}

时间复杂度: O(n) 其中n是数组的长度。我们最多遍历该数组一次。
空间复杂度: O(1) 我们只需要常数的空间存储若干变量。

通用解法: 为了让解法更具有一般性,我们将原问题的「保留2位」修改为「保留k位」。

对于此类问题,我们应该进行如下考虑:
【1】由于是保留k个相同数字,对于前k个数字,我们可以直接保留
【2】对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第k个元素进行比较,不相同则保留

举个例子,我们令k=2,假设有如下样例[1,1,1,1,1,1,2,2,2,2,2,2,3]
【1】首先我们先让前2位直接保留,得到1,1
【2】对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面k个元素不同(答案中的第一个1),因此我们会跳过剩余的1,将第一个2追加,得到1,1,2
【3】继续这个过程,这时候是和答案中的第21进行对比,因此可以得到1,1,2,2
【4】这时候和答案中的第12比较,只有与其不同的元素能追加到答案,因此剩余的2被跳过,3被追加到答案:1,1,2,2,3

class Solution {public int removeDuplicates(int[] nums) {   return process(nums, 2);}int process(int[] nums, int k) {int u = 0; for (int x : nums) {if (u < k || nums[u - k] != x) nums[u++] = x;}return u;}
}

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

splice直接删除: 同删除有序数组中的重复项一题类似,本题要求允许存在两个重复值,那么只需要从索引值为2的地方开始遍历即可

nums[i]===nums[i-2]时,说明有大于2个重复项,那么利用splice删除当前索引下的数组值,因为删除数组元素后数组长度发生改变,所以需要i--回到当前索引位置继续检索,否则会跳过一个未检索到的元素,最后输出数组长度即可

/*** @param {number[]} nums* @return {number}*/
var removeDuplicates = function (nums) {for (var i = 2; i < nums.length; i++) {if (nums[i] === nums[i - 2]) {nums.splice(i,1)i--} }return nums.length
};

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm基础篇之垃圾回收[2](垃圾回收算法)

文章目录 版权声明垃圾回收算法核心思想垃圾回收算法的历史垃圾回收算法的评价标准垃圾分类算法分类标记清除算法核心思想标记清除算法优缺点 复制算法核心思想完整案例复制算法的优缺点 标记整理算法核心思想标记整理算法优缺点 分代垃圾回收算法arthas查看分代内存情况核心思…

stm32软件安装以及创建工程

文章目录 前言一、软件安装软件破解 二、创建工程三、创建项目创建组配置启动文件添加到组 为项目添加头文件路径创建源文件&#xff08;main函数文件&#xff09;使用寄存器配置引脚拼接好STLINK与stm32最小电路板的接线编写程序配置STLink下载程序配置寄存器配置13号端口&…

用户体验优化:HubSpot的秘密武器

在当今数字化市场中&#xff0c;提升用户体验已经成为企业成功的关键因素之一。HubSpot&#xff0c;作为一款领先的营销自动化工具&#xff0c;不仅在推动销售业绩上表现出色&#xff0c;同时通过其独特的策略也致力于提升用户体验。运营坛将深入探讨HubSpot是如何通过个性化推…

Leetcode—41. 缺失的第一个正数【困难】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—41. 缺失的第一个正数 实现代码 class Solution { public:int firstMissingPositive(vector<int>& nums) {int n nums.size();// nums[i] i 1;// nums[i] - 1 i;// nums[nums[i] - 1] nums[i];for(int …

能源管理新高度DI/DO/CAN/RS485/USB网关助力二次开发

能源管理领域正在寻求更为智能化和高效的解决方案。一款集成了先进ARM架构处理器的边缘计算能源储能网关应运而生&#xff0c;以其卓越的性能和丰富的接口功能吸引了众多行业用户的关注。 这款网关不仅配备有常规的数字输入&#xff08;DI&#xff09;、数字输出&#xff08;DO…

【简便方法和积累】pytest 单元测试框架中便捷安装插件和执行问题

又来进步一点点~~~ 背景&#xff1a;之前写了两篇关于pytest单元测试框架的文章&#xff0c;本篇内容对之前的做一个补充 一、pytest插件&#xff1a; pytest 有非常多的插件&#xff0c;很方便&#xff0c;以下为插件举例&#xff1a; pytest&#xff0c;pytest-html&#x…

新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)

本文记录于数学建模老哥视频的学习过程中。b站视频&#xff1a;http://【【零基础教程】老哥&#xff1a;数学建模算法、编程、写作和获奖指南全流程培训&#xff01;】https://www.bilibili.com/video/BV1kC4y1a7Ee?p50&vd_sourceff53a726c62f94eda5f615bd4a62c458 目录…

树型结构构建,模糊查询,过滤

一、前言 1、最近在做甘特图&#xff0c;有些需求和树型结构要求很大&#xff0c;看的是 pingCode&#xff0c;有搜索 2、还有抽取一部分树型结构的&#xff0c;如下是抽取上面的结构类型为需求的&#xff0c;重新组成树型 二、构建多颗树型结构 1、某些业务下&#xff0c;从…

C语言指针的几种用途

先看题目&#xff0c;写一个fun函数&#xff0c;统计一个字符串中某个字符出现的次数&#xff0c;以及这个字符第一次出现的位置。 看起来很简单&#xff0c;似乎几行就可以搞定&#xff0c;但是写出来之后&#xff0c;才发现代码怎么这么长&#xff01;程序里多处使用了指针&…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件&#xff1a;子组件A&#xff1a;子组件B&#xff1a;eventbus/index.js&#xff1a; EventBus的基本使用方法&#xff1a; 示例背景 在Vue中&#xff0c;使用EventBus可以实现组件…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了&#xff0c;因为urllib现在已经很少人用&#xff0c;大部分人用得是requests&#xff0c;requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA&#xff01; 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

Java开发工具 IntelliJ IDEA 2023中文

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于多种编程语言&#xff0c;包括Java、Python、Kotlin等。它提供了许多特色功能&#xff0c;以提高开发效率和代码质量。 Java开发工具 IntelliJ IDEA 2023中文 以下是一些IntelliJ ID…

大数据分析|设计大数据分析的三个阶段

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

扫盲软件开发工具低代码

目录 一、低代码是什么&#xff1f; 二、低代码平台的优势和劣势都是什么&#xff1f; 三、低代码操作方式 四、写在最后 一、低代码是什么&#xff1f; 低代码是一套可视化开发工具&#xff0c;它帮开发者把前后端基础功能写扎实&#xff0c;开发者只需要通过填表配置或拖…

C#——三角形面积公式

已知三角形的三个边&#xff0c;求面积&#xff0c;可以使用海伦公式。 因此&#xff0c;可以执行得到三角形面积公式的计算方法代码如下&#xff1a; /** / <summary>* / 三角形面积公式* / </summary>* / <param name"a">边长a</param>*…

OfficeWeb365 Readfile 任意文件读取漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 Rea…

前端常见标签

<li> (List Item)&#xff1a;定义列表中的一个项目&#xff08;项&#xff09; <ul> (Unordered List)&#xff1a;定义无序列表 <ol> (Ordered List)&#xff1a;定义有序列表 <a> (Anchor Tag)&#xff1a;定义超链接 <ul><li>苹…

何以穿越产业周期?解读蓝思科技2023年增长密码

1月30日晚&#xff0c;蓝思科技发布了2023年业绩预告&#xff0c;2023年预计实现归母净利润29.38亿元-30.60亿元&#xff0c;同比增长20%-25%。 松果财经注意到&#xff0c;蓝思科技通过垂直整合&#xff0c;构筑了更具竞争力的产业链条。一方面&#xff0c;公司打造了包含ODM…

蓝桥杯---煤球数目

有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 代码 pu…

Web3生态系统:构建去中心化的数字社会

随着科技的飞速发展&#xff0c;我们正处在迈向数字未来的道路上&#xff0c;而Web3生态系统则成为这一变革的中心。不仅仅是技术的演进&#xff0c;Web3代表着对传统互联网体系的颠覆&#xff0c;致力于构建一个去中心化的数字社会。本文将深入探讨Web3的核心特征、对金融、社…