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

代码训练(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.hqwc.cn/news/539808.html

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

相关文章

【深度学习】diffusers 学习过程记录,StableDiffusion扩散原理

教程地址&#xff1a;https://huggingface.co/docs/diffusers/quicktour 文章目录 环境扩散模型噪声残差的作用原理&#xff0c;文字编码如何给入Unetschedulerguidance_scalescheduler.init_noise_sigma训练时候的反向传播 环境 python3.10安装环境&#xff1a; pip install…

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

C++——类和对象(1)

1. 面向对象和面向过程对比 当涉及到编程范式时&#xff0c;两个主要的方法是面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;和面向过程编程&#xff08;Procedural Programming&#xff09;。这两种编程范式在解决问题和组织代码时有着不同…

每周一算法:迭代加深搜索

题目链接 加成序列 题目描述 满足如下条件的序列 X X X&#xff08;序列中元素被标号为 1 、 2 、 3 … m 1、2、3…m 1、2、3…m&#xff09;被称为加成序列&#xff1a; X [ 1 ] 1 X[1]1 X[1]1 X [ m ] n X[m]n X[m]n X [ 1 ] < X [ 2 ] < … < X [ m − 1 ]…

Redis:持久化、线程模型、大 key

Redis持久化方式有什么方式&#xff1f; Redis 的读写操作都是在内存中&#xff0c;所以 Redis 性能才会高&#xff0c;但是当 Redis 重启后&#xff0c;内存中的数据就会丢失&#xff0c;那为了保证内存中的数据不会丢失&#xff0c;Redis 实现了数据持久化的机制&#xff0c…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

使用helm部署clickhouse

&#xff08;作者&#xff1a;陈玓玏&#xff09; 前置条件 已安装 Kubernetes 集群&#xff1b; 已安装 Helm 包管理工具。 部署 1 添加 RadonDB ClickHouse 的 Helm 仓库 helm repo add ck https://radondb.github.io/radondb-clickhouse-kubernetes/ helm repo upd…

Figure与OpenAI 联手推出新机器人;荣耀首款「AI PC」即将发布

▶ Figure 与 OpenAI 联手推出新机器人 AI 机器人公司 Figure 发布了他们与 OpenAI 的合作成果&#xff0c;将 OpenAI 的大模型运用在其机器人 Figure 01 上。 据介绍&#xff0c;OpenAI 大模型加持的 Figure 01 机器人现在可以与人全面对话。 OpenAI 模型为机器人提供了高级…

git基础命令(一)

目录 基础概念git statusgit addgit diffgit loggit commit文件可以处于以下三种状态之一远程存储库与本地存储库参考 用于知识记录。后续有新的的内容&#xff0c;例子&#xff0c;将持续更新本文档。 基础概念 工作树&#xff1a;git add 之前&#xff0c;变动内容的文件列表…

微信小程序之tabBar

1、tabBar 如果小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部有 tab 栏可以切换页面&#xff09;&#xff0c;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面。 属性类型必填默认值描述colorHexColor是tab 上的文字默认颜色…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景&#xff1a; 今天使用docker部署了一个RabbitMQ&#xff0c;浏览器打开15672可视化页面发送消息后不显示Overview中的折线图&#xff0c;还有队列中的Messages&#xff0c;因为我要看队列中的消息数量。 解决方案&#xff1a; 进入容器内部 docker exec -it 容器id…