代码训练LeetCode(11)删除有序数组中的重复项II

news2024/9/25 13:16:20

代码训练(11)LeetCode之删除有序数组中的重复项II

Author: Once Day Date: 2024年3月14日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 80. 删除有序数组中的重复项 II - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(11)LeetCode之删除有序数组中的重复项II
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

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

比如对于[1, 1, 1, 2, 2, 3],应该返回长度5,数组则变更为[1, 1, 2, 2, 3]

2. 分析

给定一个有序数组 nums,你需要原地修改这个数组,去除那些出现超过两次的重复元素。这里的“原地”意味着你不能使用额外的数组结构来辅助完成这个任务;仅能使用有限的额外空间(O(1)),也就是说,除了几个变量以外,不得使用额外的空间资源。

由于数组已经有序,所以重复的元素一定是连续的。我们可以使用两个指针来解决这个问题:

  1. i:慢指针,指向当前需要检查的位置。
  2. j:快指针,遍历数组。

分析步骤

  1. 初始化两个指针 i = 2j = 2(因为前两个元素最多保留两次,所以可以直接跳过)。
  2. 遍历数组,从索引 2 开始,直到数组结束。
  3. 如果 nums[j]nums[i-2] 不同,说明 nums[j] 可以保留(因为这保证了最多只有两个重复元素):
    • nums[j] 的值赋给 nums[i]
    • 然后递增 i
  4. 无论元素是否相同,j 都需要递增,继续检查下一个元素。
  5. j 遍历完整个数组时,i 就是新数组的长度。

假设有数组 nums = [1,1,1,2,2,3]

  • 初始化 ij2
  • j=2 时,nums[j]nums[i-2] 都是 1,因此跳过。
  • j 增加到 3nums[j]2,可以保留,所以 nums[i] = nums[j],然后 ij 都增加 1
  • 重复以上步骤直到 j 遍历完数组。
  • 结果数组是 [1,1,2,2,3],新数组长度为 5

性能优化关键点

  • 尽量减少不必要的赋值操作,因为数组是有序的,所以当检测到不需要删除元素时,可以跳过赋值。
  • 使用局部变量存储频繁访问的数组元素,减少数组索引操作以提高速度。
3. 代码实现
#include <stdio.h>

int removeDuplicates(int* nums, int numsSize) {
    if (numsSize <= 2) {
        return numsSize;
    }

    int i = 2;
    for (int j = 2; j < numsSize; j++) {
        if (nums[j] != nums[i - 2]) {
            nums[i++] = nums[j];
        }
    }
    return i;
}

这段代码实现了一个函数 removeDuplicates,用于移除一个有序整数数组中出现的重复元素,但保留最多两次重复出现。函数的主要逻辑如下:

  1. 函数接收两个参数:整数数组 nums 和数组的大小 numsSize
  2. 首先判断数组大小是否小于等于 2,如果是,则直接返回原始数组大小,因为不需要进行去重操作。
  3. 初始化一个变量 i 为 2,表示去重后数组的当前位置。
  4. 使用一个 for 循环遍历数组,从索引 2 开始到数组末尾。
  5. 在循环内部,比较当前元素 nums[j] 与去重后数组的倒数第二个元素 nums[i - 2] 是否相等:
    • 如果不相等,说明当前元素出现次数不超过两次,将其复制到去重后数组的当前位置 nums[i],并将 i 自增 1。
    • 如果相等,说明当前元素已经出现两次,不进行复制操作,直接继续循环。
  6. 循环结束后,返回 i 的值,表示去重后数组的长度。

这个函数通过原地修改数组的方式,将重复出现超过两次的元素移除,保留最多两次重复出现的元素。最终返回去重后数组的长度。时间复杂度为 O(n),空间复杂度为 O(1)。

运行结果如下(仅供参考):

在这里插入图片描述

4. 总结

这个问题考察了数组操作和双指针技巧的使用。这类问题在编程中相当常见,特别是在处理数据集或者优化存储空间时。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

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

相关文章

AI 大模型赋能手机影像,小米14 Ultra 让真实有层次

2月22日&#xff0c;小米龙年第一场重磅发布会&#xff0c;正式发布专业影像旗舰小米14 Ultra。 此前小米发布的两代 Ultra&#xff0c;在不同维度&#xff0c;引领了移动影像行业的走向。最新的小米14 Ultra 在定义的时候&#xff0c;我们反复在思考&#xff1a;怎么才能把移动…

三维高斯是什么

最近3DGS的爆火&#xff0c;引发了一众对三维高斯表达场景的研究。这里的三维高斯是什么&#xff1f;本文用简答的描述和简单实验来呈现三维高斯的数学意义。本文没有公式推导&#xff0c;主打一个意会。 我们高中都学过高斯分布&#xff0c;即一个钟形曲线。它的特点是有一个…

OpenAI的GPT-4.5 Turbo:意外曝光且可能在六月份推出

网络媒体THE DECODER的联合创始人兼出版人Matthias认为&#xff0c;人工智能技术将彻底改变人类和计算机的互动方式。 最新消息显示&#xff0c;OpenAI的最新力作GPT-4.5 Turbo已经在网络上意外曝光。首批发现此信息的是Bing和DuckDuck Go等搜索引擎&#xff0c;它们在官方发布…

吴恩达deeplearning.ai:独热编码One-hot连续有价值的特征回归树

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 One-hot编码连续有价值的特征回归树 在之前的决策树例子中&#xff0c;每个分裂都只有两种选择&#xff0c;但是今天我们将提到一种新的分裂方式叫做One-hot&#xff0c;可以解决以…

Redis开发规范与性能优化(二)

开发规范与性能优化 3.客户端使用 1.【推荐】避免多个应用使用一个Redis示例 正例:不相干的业务拆分&#xff0c;公共数据库做服务化 2.【推荐】使用带有连接池的数据库&#xff0c;可以有效控制链接&#xff0c;同时提高效率&#xff0c;标准使用方式如代码所示 public c…

Python Web开发记录 Day10:Django part4 靓号管理与优化

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、靓号列表3、新建靓号4、编辑靓…

无人机自动返航算法部署与飞行控制实践

一、环境准备 无人机硬件&#xff1a;确保你有一台支持自定义飞行控制的无人机&#xff0c;通常配备有Pixhawk或其他类似的飞行控制器。 地面站软件&#xff1a;安装如Mission Planner或QGroundControl等地面站软件&#xff0c;用于配置无人机参数和上传飞行控制代码。 编程环…

Hadoop大数据应用:NFS网关 连接 HDFS集群

目录 一、实验 1.环境 2.NFS网关 连接 HDFS集群 3. NFS客户端挂载HDFS文件系统 二、问题 1.关闭服务报错 2.rsync 同步报错 3. mount挂载有哪些参数 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;…

ASP.NET

Web控件 Web控件-内部控件 ASP.NET引入一组称为”内部控件”的新控件&#xff0c;它们专门用于ASP.NET 内部控件的使用方法与HTML控件相同&#xff0c;它们映射到HTML元素并通过使用 runat”server”属性在服务器上执行 Web控件-列表控件 这些控件用于在Web页中创建数据列表…

Revit二次开发,tuple,valuetuple,anonymousType匿名类型的区别,笔记记录

Revit二次开发&#xff0c;tuple&#xff0c;valuetuple&#xff0c;anonymousType匿名类型的区别&#xff0c;笔记记录 Tuple<int, string> tuple new Tuple<int, string>(1, "hello");//tuple ValueTuple<int, string> valueTuple (1, "…

叶顺舟:手机SoC音频趋势洞察与端侧AI技术探讨 | 演讲嘉宾公布

后续将陆续揭秘更多演讲嘉宾&#xff01; 请持续关注&#xff01; 2024中国国际音频产业大会(GAS)将于2024年3.27 - 28日在上海张江科学会堂举办。大会将以“音无界&#xff0c;未来&#xff08;Audio&#xff0c; Future&#xff09;”为主题。大会由中国电子音响行业协会、上…

Hive3.0.0安装初始化过程,schematool -dbType mysql -initSchema报错

详细如下&#xff1a; 从字面意思理解&#xff0c;是在hive-site.xml文件3213行出现了非法字符&#xff0c;处理步骤如下 1、使用vi 3213 hive-site.xml打开文件 2、删除“&#8”&#xff0c;保存文件 3、再次执行初始化命令 schematool -dbType mysql -initSchema 4、登…

交换机/路由器的存储介质-华三

交换机/路由器的存储介质-华三 本文主要介绍网络设备的存储介质组成。 ROM(read-only memory&#xff0c;只读存储器) 用于存储 BootROM程序。BootROM程序是一个微缩的引导程序&#xff0c;主要任务是查找应用程序文件并引导到操作系统&#xff0c;在应用程序文件或配置文件出…

基于检索增强的 GPT-3.5 的文本到 SQL 框架,具有样本感知提示和动态修订链。

文章目录 一、论文关键信息二、基础概念三、主要内容1. Motivations2. Insights3. 解决方案的关键4. 实验 四、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;Retrieval-augmented GPT-3.5-based T…

Windows安装及配置jdk

Windows安装及配置jdk Windows安装及配置jdk下载安装环境变量配置JAVA_HOME和JRE_HOME 配置Path验证环境 Windows安装及配置jdk 下载安装 JDK的下载是免费的&#xff0c;可以直接去官网下载最新版本&#xff0c;比较安全&#xff0c;安装的时候直接点击下一步到底&#xff0c;…

人生就像是一场旅行,房子和车子不过是旅途中的临时栖息地和代步工具

图片由AI生成 人生就像是一场漫无目的的旅行&#xff0c;房子和车子不过是旅途中的临时栖息地和代步工具。 我们费尽心思&#xff0c;经过无数个日夜的奋斗&#xff0c;终于有了自己的车和房&#xff0c;以为这就是生活的全部。 但&#xff0c;物质的堆砌永远无法定义我们的价值…

unity3d Animal Controller的Animal组件中Speeds,States和modes基础部分理解

Speeds 速度集是修改你可以做的原始动画,增加或减少运动,旋转,或动画速度。它们与 州 所以,当动物在运动状态下,在飞行或游泳时,你可以有不同的速度 如果你的性格动画是 (已到位), 你一定要调整速度 位置 和 旋转 每一种的价值观 速度装置 …否则,它们不会移动或旋转。 每个速…

微服务分布式springcloud研究生志愿填报辅助系统

本文讲述了研究生志愿填报辅助系统。结合电子管理系统的特点&#xff0c;分析了研究生志愿填报辅助系统的背景&#xff0c;给出了研究生志愿填报辅助系统实现的设计方案。 本论文主要完成不同用户的权限划分&#xff0c;不同用户具有不同权限的操作功能&#xff0c;在用户模块&…

Spring状态机简单实现

一、什么是状态机 状态机&#xff0c;又称有限状态自动机&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的计算模型。状态机的概念其实可以应用的各种领域&#xff0c;包括电子工程、语言学、哲学、生物学、数学和逻辑学等&#xff0c;例如日常生活中的电…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…