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. 创建两个指针i和j,其中i用于遍历数组,j用于指向下一个待插入的位置。
  2. 遍历数组,对于每个元素,如果它是第一次出现或者第二次出现,就将它放到数组的前面,即nums[j++] = nums[i]。
  3. 如果一个元素出现了超过两次,就跳过该元素,继续遍历数组。
  4. 最后,返回j的值作为新数组的长度。

三、具体代码

class Solution {public int removeDuplicates(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int j = 1;int count = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {count++;} else {count = 1;}if (count <= 2) {nums[j++] = nums[i];}}return j;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 该算法只涉及一次遍历数组,其中 n 是数组的长度。
  • 在遍历过程中,每个元素最多被访问两次(一次是判断是否与前一个元素相同,另一次是可能将其复制到前面的位置)。
  • 因此,总的时间复杂度是 O(n)。
2. 空间复杂度
  • 该算法是原地操作,除了几个用于存储索引和计数器的变量外,没有使用额外的空间。
  • 变量 j 和 count 只使用了常数级别的空间。
  • 因此,总的空间复杂度是 O(1)。

五、总结知识点

  1. 数组操作:代码直接在输入的数组 nums 上进行操作,这是原地算法的一个例子,即不使用额外的数组空间来解决问题。

  2. 指针或索引概念:变量 i 和 j 被用作索引或指针,分别用于遍历数组和指向下一个待插入元素的位置。

  3. 计数器:变量 count 被用来跟踪当前元素重复出现的次数。

  4. 循环结构:使用了 for 循环来遍历数组,这是基本的控制结构之一。

  5. 条件语句:使用了 if 和 else 语句来根据不同条件执行不同的代码块。

  6. 数组元素的访问和赋值:通过索引 i 和 j 访问和修改数组 nums 中的元素。

  7. 变量自增:使用了 j++ 来在每次插入元素后更新 j 的值,这是 Java 中的一种简洁的写法,等同于 j = j + 1

  8. 函数定义:整个解决方案被定义在一个名为 removeDuplicates 的公共方法中,这是面向对象编程中的一个基本概念。

  9. 边界条件检查:在方法开始时,检查了 nums 是否为 null 或长度为 0,以确保代码的鲁棒性。

  10. 逻辑思维:整个算法的实现需要逻辑思维来理解如何通过比较和计数来删除重复的元素,同时保持元素出现次数不超过两次。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

苹果发布开源模型;盘古大模型5.0将亮相;英伟达将收购 Run:ai

苹果首次发布开源语言模型 近期&#xff0c;苹果在 Hugging Face 发布了 OpenELM 系列模型。OpenELM 的关键创新是逐层扩展策略&#xff0c;该策略可在 transformer 模型的每一层中有效地分配参数&#xff0c;从而提高准确性。 与具有统一参数分配的传统语言模型不同&#xff…

【免费Java系列】给大家出一些JavaSE基础第八天的内容案例 , 让大家更好的理解与掌握

String字符串 案例一 求取字符串的长度 public class Main {public static void main(String[] args) {String str "Hello World";String substring str.substring(6);System.out.println("截取后的字符串为&#xff1a;" substring);} }输出结果&…

windows下pysqlite3安装

pysqlite3 下载地址&#xff1a;SQLite Download Page windows下安装 首先在官网中下载以下文件 sqlite-amalgamation-3450300.zip #源码文件 sqlite-dll-win-x64-3450300.zip # 根据系统选择32或者64&#xff0c;可通过查看我的电脑属性中查看 sqlite-tools-win-x64-345…

springboot笔记一:idea社区版本创建springboot项目的方式

社区idea 手动maven 创建springboot项目 创建之后修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

STM32使用PWM控制舵机

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 舵机简介 2. 硬件连接 3. 代码实现 3.1 PWM.c 3.2 PWM.h 3.3 Servo.c 3.4 Servo.h 3.5 main.c 3.6 完整工程文件 PWM和OC输出详解&#xff1a; STM32定时器的OC比较和PWM​​​​​​​ 1. …

CentOS 7虚拟机配置过程中所需组件的安装(二)

1.安装net-tools组件&#xff08;解决无 ifconfig&#xff09; # yum install net-tools 2.安装gcc、c编译器以及内核文件 # yum -y install gcc gcc-c kernel-devel 验证安装成功 3.安装nano&#xff08;文本编辑器&#xff09; # yum install nano

AD7366/AD7367 系列模数转换器

这份文件是关于 AD7366/AD7367 系列模数转换器&#xff08;ADC&#xff09;的数据手册&#xff0c;由 Analog Devices, Inc. 提供。以下是该文件的核心内容概要&#xff1a; 产品介绍&#xff1a; AD7366/AD7367 是双通道、12位/14位分辨率的高速、低功耗逐次逼近型模拟-数字转…

python监听html click教程

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python实现监听HTML点击事件 在Web开发中&#xff0c;经常需要在用户与页面交互时执行一些…

汉译英早操练-(二十二)

往期回顾 汉译英早操练-&#xff08;十九&#xff09;-CSDN博客 汉译英早操练-(二十)-CSDN博客 汉译英早操练-&#xff08;二十一&#xff09;-CSDN博客 我们继续学习汉译英五个句子&#xff0c;看看这五个需要注意些什么。 北京人大约生活在公元前460,000年到230,000年之间…

【线上问题】记一次更新问题

目录 1. 问题说明2. 测试3. 解决 1. 问题说明 1.生产环境A服务更新后&#xff0c;通过RestTemplate或HttpUtil访问B服务的接口报403错误。2.更新前A服务是正常的。3.B服务前几天新增了外网域名&#xff0c;A服务也改了B服务的接口域名配置。4.由于业务修改&#xff0c;需要根据…

JPA 如何修改 联表查询返回的Map

记录解决两个问题&#xff1a; 1、JPA 中联表查询会返回一个不可修改的集合Map 如果要修改就会报 &#xff1a;A TupleBackedMap cannot be modified. 解决方法&#xff1a; 不直接修改这个 Map。如果你需要对 Map 进行修改操作&#xff0c;你可以创建一个新的 Map&#xff…

500V 直流充电桩测试负载箱的基础知识

500V直流充电桩测试负载箱是一种专门用于测试和验证直流充电桩性能的设备。它能够模拟真实的充电过程&#xff0c;对充电桩的输出电压、电流、功率等参数进行精确的测量和控制&#xff0c;以确保充电桩的稳定性和安全性。 一、工作原理 500V直流充电桩测试负载箱主要由电源模块…

【Linux】Linux上如何挂载磁盘

目录 一、查看磁盘使用情况df -h 查看已挂载磁盘的大概使用情况fdisk -l 查看主机上所有磁盘设备的详细情况lsblk 查看主机上所有磁盘设备基本信息 二、进行磁盘挂载mkfs 在特定的分区上建立 linux 文件系统mount 进行磁盘挂载文件系统配置 一、查看磁盘使用情况 df -h 查看已…

3分钟了解拍摄VR全景需要哪些硬件

VR全景图片是一张水平方向360度&#xff0c;垂直方向180度&#xff0c; 图片尺寸宽高比为2:1的图片。 通过720yun APP或720yun官网上传生成全景H5页面&#xff0c;即可360度全方位观看画面中的景象。 拍摄VR全景有很多方法&#xff0c;下面介绍用单反相机、全景相机、智能手机…

学习笔记-数据结构-顺序表(2024-04-25)

从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 设计思想&#xff1a;基于索引的数组操作&#xff0c;线性搜索过程 大致流程&#…

Java SE入门及基础(50) Java实现LinkedList(单向链表、双向链表) Java实现栈

目录 List 接口 1. 特性描述 List 接口常用方法 2. ArrayList 示例及源码解读 3. LinkedList 示例及源码解读 单向链表 双向链表 4. 栈 练习 Java SE文章参考:Java SE入门及基础知识合集-CSDN博客 List 接口 1. 特性描述 A List is an ordered Collection (sometimes called…

如何实现瀑布流排列方式

瀑布流布局是一种流行的网页布局方式&#xff0c;它允许列的高度不一致&#xff0c;但宽度一致&#xff0c;从而给人一种流动的视觉效果。然而&#xff0c;使用纯CSS实现瀑布流布局并不简单&#xff0c;因为CSS本身并不支持动态计算元素的高度和位置。尽管如此&#xff0c;我们…

python--列表

列表的定义&#xff1a; 能装东西的东西&#xff08;包括字符串、数字、类型、以及列表本身等等&#xff09;。 #在python中用[ ]来表示一个列表&#xff0c;列表中的元素通过逗号&#xff08;,&#xff09;隔开。 例如&#xff1a; a ["陈冠希"&#xff0c;&qu…

OceanBase开发者大会实录-杨传辉:携手开发者打造一体化数据库

本文来自2024 OceanBase开发者大会&#xff0c;OceanBase CTO 杨传辉的演讲实录—《携手开发者打造一体化数据库》。完整视频回看&#xff0c;请点击这里&#xff1e;> 各位 OceanBase 的开发者&#xff0c;大家上午好&#xff01;今天非常高兴能够在上海与大家再次相聚&…

使用这 7 个绩效评估模板简化您的员工评估

绩效评估受到了不好的评价&#xff1b;员工发现它们压力很大&#xff0c;而管理者则发现它们很耗时。 但随着绩效管理成为 2024 年人力资源的首要任务&#xff0c;也许是时候重新思考了。绩效评估模板可以帮助减轻评估过程的麻烦。通过为管理者提供一种简单、标准化的方法来评…