leetcode_80. 删除有序数组中的重复项 II

leetcode_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 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列

题解

方法一: 普通双指针

使用双指针的解法可以参考leetcode_26. 删除有序数组中的重复项. 思路基本类似, 唯一的区别就是重复超过两次的元素我们要保留两次.

此时, 我们只需要增加一个变量t来记录j指针遍历到的重复元素都数量, 如果大于等于2, 那么就让i指针先将自身的值向后复制一下, 同时i指针也向后移动一位 nums[++i] = nums[i];, 然后再像普通的去重算法一样执行nums[++i] = nums[j];即可.

值得注意的是在c++中, nums[++i] = nums[i]是没问题的, 但是在java中, 这句代码只会让i自增, 并不能将nums[i]赋值给nums[i+1]. 具体原因我并不了解, 欢迎大家在评论区讨论.

最后再处理一下边界问题, 当数组中的最后一个元素是重复元素时, 还没来得及给他保留两份循环就结束了,

java

class Solution {public int removeDuplicates(int[] nums) {int i = 0, j = 0, t = 0;while (j < nums.length) {if (nums[i] != nums[j]) {if (t > 1) {nums[i+1] = nums[i];i++;}nums[++i] = nums[j];t = 1;} else {t++;}j++;}if (t > 1) {nums[++i] = nums[j-1];}return i+1;}
}

C++

class Solution {
public:int removeDuplicates(vector<int>& nums) {int i = 0, j = 0, t = 0;while (j < nums.size()) {if (nums[i] != nums[j]) {if (t > 1) {nums[++i] = nums[i];}nums[++i] = nums[j];t = 1;} else {t++;}j++;}if (t > 1) {nums[++i] = nums[j-1];}return i+1;}
};

方法二: 更高效的双指针

我们还是用j指针区遍历数组, 用i指针去记录有效数组的边界, 但不同的是, 每次要判断nums[i-2] != nums[j], 如果满足就把j指针指向的元素覆盖的i指针所在的位置, 然后i指针向后移动一位.

这种算法的原理也是去判断重复元素都数量有没有超过两个. 如果nums[i-2] != nums[j]这个条件不满足, 那么就说明重复的元素已经保留了两个了, 所以之后再遇到就不会再保留了, 于是j指针直接后移. 如果条件满足, 那么就说明重复的保留的重复的元素的数量还不够两个, 于是当前j指针指向的值也要保留(nums[++i] = nums[j]).

OK, 上代码

java

class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;if (n < 3) return n;int i = 2, j = 2;while (j < n) {if (nums[i - 2] != nums[j]) {nums[i++] = nums[j];}j++;}return i;}
}

C++

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n < 3) return n;int i = 2, j = 2;while (j < n) {if (nums[i - 2] != nums[j]) {nums[i++] = nums[j];}j++;}return i;}
};

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

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

相关文章

大龄程序员的出路在哪里?

对于许多资深程序员而言&#xff0c;年龄并非职业发展的桎梏&#xff0c;反而如同陈年的美酒&#xff0c;随着时间的流逝愈发醇厚。他们手握的是丰富的经验和不断进阶的技能&#xff0c;而这些都为他们打开了职业发展的无数扇大门。让我们一同探索这些令人心动的可能性吧&#…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…

SQL概述及其规则与规范

SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年&#xff0c;世界第一台电脑诞生&#xff0c;如今&#xff0c;互联网已经非常壮大&#xff0c;在这几十年间互联网得到了飞速的发展&#xff0c;无数的技术在其中起起伏伏&#xff0c;但是有一门技术从未消失&#xf…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

Qt类 | QLabel类详解

文章目录 一、QLabel类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.alignment与setAlignment函数 -- 标签内容的对齐方式3.buddy与setBuddy函数 -- QLabel关联的伙伴控件4.hasScaledContents与setScaledC…

基于YOLOv8深度学习的水果智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、卷积神经网络

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

End-to-End Object Detection with Transformers【目标检测-方法详细解读】

摘要 我们提出了一种新的方法,将目标检测视为一个直接的集合预测问题。我们的方法简化了检测流程,有效地消除了许多手工设计的组件,如非极大值抑制程序或锚生成,这些组件显式编码了我们关于任务的先验知识。新框架的主要成分,称为DEtection TRansformer或DETR,是一个基于…

下载工具 -- Internet Download Manager(IDM) v6.42 build 14 绿色特别版

软件简介 Internet Download Manager&#xff08;IDM&#xff09;是一款功能强大的下载工具&#xff0c;它可以帮助用户更高效、更稳定地下载网络上的各种文件。IDM支持多线程下载技术&#xff0c;可以将文件分割成多个部分同时下载&#xff0c;从而显著提高下载速度。此外&am…

C#字符串基本操作

1、代码 //1、创建字符串&#xff08;获取长度&#xff09;string str "Hello, World!";Console.WriteLine($"string:{str},length:{str.Length}");//2、字符串连接string str1 "Hello, ";string str2 "World!";Console.WriteLine…

在 Windows 11/10/8 上恢复误删除文件的最佳方法

如果您刚刚在计算机上重新安装了 Windows 操作系统&#xff0c;结果硬盘上的所有文件都消失了&#xff0c;有没有办法从 Windows 11/10 中恢复误删除的文件&#xff1f; 许多因素都可能导致 PC 上的文件被删除。除了重新安装操作系统外&#xff0c;其他常见原因还包括意外删除…

MAC 数据恢复软件: STELLAR Data Recovery For MAC V. 12.1 更多增强功能

天津鸿萌科贸发展有限公司是 Stellar 系列软件的授权代理商。 STELLAR Data Recovery For MAC 该数据恢复软件可从任何存储驱动器、清空的回收站以及崩溃或无法启动的 Mac 设备中恢复丢失或删除的文件。 轻松恢复已删除的文档、照片、音频文件和视频。自定义扫描以帮助恢复特…

Vue.js 生命周期详解:从创建到销毁的全过程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决&#xff1a;java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

STM32 IAP 需要关注的一些事

1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序&#xff0c;一个是bootloader&#xff0c;一个是user程序&#xff0c;这两个程序的功能分别的什么作用的&#xff1f; 3、编译的固件是怎么分布的&#xff1f;通过那个配置文件去指导编译器去排布…

Spring Boot集成kudu快速入门Demo

1.什么是kudu 在Kudu出现前&#xff0c;由于传统存储系统的局限性&#xff0c;对于数据的快速输入和分析还没有一个完美的解决方案&#xff0c;要么以缓慢的数据输入为代价实现快速分析&#xff0c;要么以缓慢的分析为代价实现数据快速输入。随着快速输入和分析场景越来越多&a…

网络爬虫基础介绍

什么是爬虫 Web 爬虫&#xff0c;也称为网络蜘蛛或网络机器人&#xff0c;是一种用于自动化访问和抓取网页内容的程序。爬虫通过模拟用户访问网页的行为&#xff0c;从互联网上获取数据&#xff0c;并将其存储或进一步处理。 爬虫的应用场景 搜索引擎索引&#xff1a;如 Google…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

C语言强化-1.数据结构概述

与408的关联&#xff1a;1. 逻辑结构和存储结构在选择题中会有涉及。2. 时间复杂度几乎是每一年大题必考内容&#xff01; 逻辑结构与存储结构 逻辑结构&#xff08;对人友好&#xff09; 集合结构&#xff08;无关系&#xff09;线性结构&#xff08;一对一&#xff09;树形…

Django Q()函数

Q() 函数的作用 在Django中&#xff0c;Q()函数是一个非常有用的工具&#xff0c;主要用于构建复杂的查询。它允许你创建复杂的查询语句&#xff0c;包括AND、OR和NOT逻辑操作。这对于处理复杂的数据库查询特别有用&#xff0c;特别是在你需要组合多个条件或处理复杂的过滤逻辑…