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

力扣LeetCode: 80 删除有序数组中的重复项Ⅱ

题目:

给你一个有序数组 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 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按升序排列

解法一:双指针

解决思路

  1. 有序数组的特性

    • 因为数组是有序的,所以重复的元素一定是连续的。

    • 我们需要确保每个元素最多出现两次。

  2. 双指针法

    • 使用两个指针:slow 和 fast

    • slow 指针用于构建新数组,指向当前可以放置新元素的位置。

    • fast 指针用于遍历原数组,检查每个元素是否可以保留。

  3. 核心逻辑

    • 如果当前元素 nums[fast] 不等于 nums[slow - 2],说明 nums[fast] 可以保留,并且不会导致重复超过两次。

    • 将 nums[fast] 放到 nums[slow] 的位置,然后移动 slow 指针。

    • 如果 nums[fast] 等于 nums[slow - 2],说明 nums[fast] 已经出现了两次,跳过它。

  4. 边界条件

    • 如果数组长度小于等于 2,直接返回原数组长度,因为不可能有重复超过两次的元素。

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) return n; // 如果数组长度小于等于2,直接返回
  • n = nums.size():获取数组的长度。

  • if (n <= 2) return n;:如果数组长度小于等于 2,直接返回原数组长度,因为不可能有重复超过两次的元素。

        int slow = 2; // 慢指针从索引2开始for (int fast = 2; fast < n; ++fast) {
  • slow = 2:慢指针从索引 2 开始,因为前两个元素无论如何都可以保留。

  • for (int fast = 2; fast < n; ++fast):快指针从索引 2 开始遍历数组。

            // 如果当前元素不等于慢指针前两个元素if (nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast]; // 将当前元素放到慢指针位置++slow; // 移动慢指针}
  • if (nums[fast] != nums[slow - 2])

    • 检查当前元素 nums[fast] 是否等于 nums[slow - 2]

    • 如果不等,说明 nums[fast] 可以保留,并且不会导致重复超过两次。

  • nums[slow] = nums[fast];

    • 将 nums[fast] 放到 nums[slow] 的位置。

  • ++slow;

    • 移动慢指针,指向下一个可以放置新元素的位置。

        }return slow; // 返回新数组的长度}
};
  • return slow;

    • 最终 slow 指针的位置就是新数组的长度。

完整代码

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) return n; // 如果数组长度小于等于2,直接返回int slow = 2; // 慢指针从索引2开始for (int fast = 2; fast < n; ++fast) {// 如果当前元素不等于慢指针前两个元素if (nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast]; // 将当前元素放到慢指针位置++slow; // 移动慢指针}}return slow; // 返回新数组的长度}
};

解法二:计数器遍历

  1. 遍历数组,使用一个计数器来记录当前元素的出现次数。

  2. 如果当前元素与前一个元素相同,则增加计数器。

  3. 如果当前元素与前一个元素不同,则重置计数器。

  4. 如果计数器的值小于等于2,则保留该元素,否则跳过该元素。

class Solution {
public:int removeDuplicates(vector<int>& nums) {if (nums.size() <= 2) {return nums.size();}int index = 1;  // 从第二个元素开始int count = 1;  // 计数器,记录当前元素的出现次数for (int i = 1; i < nums.size(); ++i) {if (nums[i] == nums[i - 1]) {count++;} else {count = 1;  // 重置计数器}if (count <= 2) {nums[index++] = nums[i];}}return index;}
};

代码解释:

  • index 用于记录新数组的长度,同时也是一个指针,指向当前可以放置新元素的位置。

  • count 用于记录当前元素的出现次数。

  • 遍历数组时,如果当前元素与前一个元素相同,则增加 count;否则重置 count

  • 如果 count 小于等于2,则将当前元素放入 nums[index] 位置,并增加 index

  • 最终返回 index,即新数组的长度。

相关文章:

力扣LeetCode: 80 删除有序数组中的重复项Ⅱ

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

MoMask:可将文本描述作为输入并生成相应的高质量人体运动动作

该图展示了 MoMask &#xff08;一种最先进的人体运动生成模型&#xff09;生成的运动示例。MoMask 使用文本到运动范式进行操作&#xff0c;其中它将文本描述作为输入并生成相应的高质量人体运动。这种方法确保生成的动作准确反映给定的文本条件&#xff0c;展示了 MoMask 生成…...

PAT甲级1043、 Is It a Binary Search Tree

题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree of a node contains only nodes with keys greater…...

【Python】元组

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...

[RabbitMQ] RabbitMQ常见面试题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

旋转位置编码(RoPE)讲解和代码实现

旋转位置编码(Rotary Position Embedding:RoPE)讲解和代码实现 1. 什么是位置编码? 在 Transformer 模型中,位置编码的作用是为模型提供序列中每个 token 的位置信息。因为 Transformer 本身没有像 RNN 那样的顺序结构,所以需要通过位置编码来告诉模型 token 的顺序。 …...

小红书自动化:如何利用Make批量生成爆款笔记

小红书自动化&#xff1a;如何利用Make制作个人自媒体中心&#xff0c;批量生成爆款笔记 引言 在如今信息爆炸的时代&#xff0c;如何高效地获取和分享优质内容&#xff0c;成为了每位自媒体工作者必须面对的挑战。你是否想过&#xff0c;如果能够将这项繁复的工作实现自动化…...

计算机组成原理 | (四)存储器

&#x1f32e;&#x1f32e;&#x1f32e;宝子们好呀&#xff0c;今天继续更新我的学习笔记&#xff0c;教我计算机组成原理的老师是SDUCS的zrh老师&#xff0c;感谢z老师的教导&#xff0c;接下来我就放上我的手写笔记&#xff0c;供大家学习参考&#xff0c;适合大家预习和复…...

Maven 版本管理与 SNAPSHOT 详解

1. Maven 版本管理概述 在 Maven 项目中&#xff0c;版本号&#xff08;Version&#xff09;是用于区分不同软件版本的重要标识。Maven 提供了一套标准的版本管理机制&#xff0c;包括&#xff1a; 正式版本&#xff08;Release Version&#xff09;快照版本&#xff08;SNAP…...

基于 GEE 利用 SDWI 指数进行逐月水域面积提取

目录 1 SDWI指数 2 完整代码 3 运行结果 微波遥感具有全天候、全天时工作能力&#xff0c;能穿透云层&#xff0c;不受气象条件和光照水平影响&#xff0c;因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计…...

XMind 下载与使用教程:附百度网盘地址

一、引言 在信息爆炸的时代&#xff0c;如何高效地整理和管理知识成为了许多人面临的挑战。XMind 作为一款功能强大的思维导图软件&#xff0c;能够帮助我们清晰地梳理思路、整合信息&#xff0c;从而提升学习和工作效率。本文将详细介绍 XMind 的下载方法 二、XMind 的下载与…...

[EAI-034] 通过在线强化学习改进VLA模型

Paper Card 论文标题&#xff1a;Improving Vision-Language-Action Model with Online Reinforcement Learning 论文作者&#xff1a;Yanjiang Guo, Jianke Zhang, Xiaoyu Chen, Xiang Ji, Yen-Jen Wang, Yucheng Hu, Jianyu Chen 论文链接&#xff1a;https://arxiv.org/abs/…...

Python 和 JavaScript 中 Yield 的区别

Python 和 JavaScript 中 Yield 的区别 目录 Python 和 JavaScript 中 Yield 的区别PythonyieldJavaScriptyieldPythonyield fromJavaScriptyield* 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Pythonyield 在 Python 中…...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f680;1.上传头像 -持久…...

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码&#xff1a;2.保存物品信息代码&#xff1a;3.删除仓库信息代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SSM框架开发的仓库…...

C++11新特性之unique_ptr智能指针

本节继续介绍智能指针&#xff0c;不了解的读者可以先阅读——C11新特性之shared_ptr智能指针-CSDN博客 1.介绍 unique_ptr是C11标准提供的另一种智能指针。与shared_ptr不同的是&#xff0c;unique_ptr指针指向的堆内存无法同其他unique_ptr共享&#xff0c;也就是每一片堆内…...

模型压缩 --学习记录2

模型压缩 --学习记录2 如何找到更好的权衡方式(模型量化)方法一:寻找更好的 range方法二:寻找更好的 X-fp32(浮点数)方法三:寻找更好的 scale 和 zp方法四:寻找更好的 roundPTQ 后训练量化(离线量化)QAT 量化感知训练(在线量化)量化为什么会带来加速?三、模型稀疏技…...

车载诊断工具技巧 --- CAPL Debug 功能使用介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

Sinusoidal(正弦曲线)位置编码公式详细推导过程

Sinusoidal(正弦曲线)位置编码公式推导 参考链接 Transformer升级之路&#xff1a;1、Sinusoidal位置编码追根溯源 1. 前置数学的基本概念 1.1 内积 定义&#xff1a; 内积是两个向量之间的一种运算&#xff0c;其结果为一个标量。公式&#xff1a; 对于向量 a [ a 1 , …...

<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)

一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》&#xff0c;新鲜的DeepSeek-R1推理模型&#xff0c;作者规模属实庞大。如果你正在使用Deep…...

萌新学 Python 之字符串及字符串相关函数

字符串&#xff1a;单引号、双引号、三个单引号、三个双引号 字符串属于不可变的数据类型&#xff0c;一旦被定义&#xff0c;内存地址不变 name 张三 # 字符串赋值给name后&#xff0c;内存地址存储张三&#xff0c;地址不变 username 张三 # 张三去内存中找…...

如何改善RK3588基于MPP的H265传输码率

1、降低帧率 由原来的30fps修改为25fps&#xff0c;具体修改如下&#xff1a; H265Level level H264Level::L_1080P_30FPS;修改为 H265Level level H264Level::L_1080P_25FPS; 同时修改在MppInit函数中修改如下内容&#xff1a; uint32_t fps 30;修改为uint32_t fps 2…...

系统思考—自我超越

“人们往往认为是个人的能力限制了他们&#xff0c;但事实上&#xff0c;是组织的结构和惯性思维限制了他们的潜力。”—彼得圣吉 最近和一家行业隐形冠军交流&#xff0c;他们已经是领域第一&#xff0c;老板却依然要求&#xff1a;核心团队都要自我超越&#xff0c;攻坚克难…...

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…...

day44 QT核心机制

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …...

打家劫舍3

今天和打家讲一下打家劫舍3 题目&#xff1a; 题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“…...

webpack配置之---上下文

context context 是 Webpack 配置中的一个重要属性&#xff0c;它主要用于确定模块解析时的基础目录。可以理解为是 Webpack 在解析模块时&#xff0c;基于哪个目录作为根路径来查找模块。context 的默认值是 process.cwd()&#xff0c;即当前执行 Webpack 命令时的工作目录。…...

Spring Boot: 使用 @Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ

Spring Boot: 使用 Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ 在微服务架构中&#xff0c;确保消息的可靠性和一致性非常重要&#xff0c;尤其是在涉及到分布式事务的场景中。本文将演示如何使用 Spring Boot 的事务机制和 TransactionSynchron…...

2024中国行政区划多边形矢量数据(含有十段线)仅供学习

中国标准行政区划数据GS&#xff08;2024&#xff09;0650号&#xff0c;包括&#xff1a; 分省市县 省内分市 省内分县 南海十段线与岛屿区域 全国市级行政区划 通过网盘分享的文件&#xff1a;中国标准行政区划数据GS&#xff08;2024&#xff09;0650号.rar等4个文件 链接…...