leetcode每日一题——80.删除有序数组中的重复项II(面试经典150题)

news2024/9/22 5:41:17

一、题目描述与要求

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 已按升序排列

二、解题思路

总的思路:

       先分析题目,题目说给定一个有序的数组,要求我们删除数组中出现次数大于两次的元素,并且只能够在原数组上进行修改,不能借用额外的数组,最后要求返回数组的新长度。

       首先我们要删除数组中出现次数大于两次的元素,那就必须遍历整个数组,而如何找出出现次数大于两次的元素并且将其删除呢?最简单的想法就是将每个元素依次与后面的元素进行比较,然后统计次数,在比较的同时发现出现次数大于2就进行修改,但这一实现方法需要运用到嵌套循环,空间复杂度较高,而且实现也较为复杂。因而我们可以想到“双指针”的方法,也就是利用两个指针来实现对数组元素的遍历还有更新。因而我们可以定义两个变量,一个用来遍历数组,一个用来记录更新后数组的长度以及对数组进行更新。

       然后我们来分析数组的情况,对于数组元素个数小于等于2的则可以直接返回数组长度。因为我们需要保证每个元素只出现两次,因而我们对元素进行比较应当是将第一个与第三个元素进行比较(因为题目说是有序数组),如果相等的话就代表当前元素出现次数大于2,因而将遍历指针往后移动,找到与前面元素不相等的元素,然后对其进行赋值,然后更新修改后的数组长度(也就是更新指针向后移动一位)。因而两个指针的初始值都是2,而每次比较都是用遍历指针指向的元素与更新指针所指向的元素的前面第二个元素(从右往左数第二个)进行比较。

【以下举一个示例进行分析两个指针的变化】

具体步骤:

①判断数组长度是否大于2

②初始化两个指针

③遍历数组并进行更新

④返回更新后的数组长度


三、具体代码【C语言】

int removeDuplicates(int* nums, int numsSize){
    if(numsSize<=2)  return numsSize;
    int left = 2, right = 2;//有序数组,每个元素只出现两次,因此right从下标2开始遍历
    //while的执行条件为right<numsSize,即未遍历完数组
    while (right < numsSize) {
        //比较当前位置的元素与自己前面第二个元素是否相等
        //如果相等则需要继续向后面找新的元素替代掉当前位置的元素
        //如果不相等则将此时right所指向的元素赋值给left所指向的元素
        //left就是修改后的数组长度,而right是用来遍历访问整个数组的
        if (nums[left - 2] != nums[right]) {
            nums[left] = nums[right];
            ++left;
        }
        ++right;
    }
    return left;
}

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

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

相关文章

NodeJS安装教程(详细)

系列文章 MySQL安装教程&#xff08;详细&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126037520 MySQL卸载教程&#xff08;详细&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129279265 …

Linux 内核源代码情景分析(一)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析&#xff08;一&#xff09; 文章目录 系列文章目录一、存储管理1、外部设备存储空间的地址映射&#xff08;1&#xff…

LinK3D论文详解

摘要 特征提取和匹配是许多计算机视觉任务的基本部分&#xff0c;例如二维或三维物体检测、识别和配准。众所周知&#xff0c;二维特征提取和匹配已经取得了很大的成功。遗憾的是&#xff0c;在3D领域&#xff0c;由于描述能力差和效率低&#xff0c;目前的方法无法支持3D激光雷…

uniapp在微信开放平台创建移动应用时,如何生成应用签名的问题

包名在打包的时候是必填项&#xff0c;就不多赘述了… 微信开放平台获取应用签名&#xff0c; 场景&#xff1a; 首先需要在手机或者模拟器上下载签名生成工具&#xff0c;下载地址&#xff1a;下载签名生成工具 然后手机打开&#xff0c; 在这里输入你的app打包时的包名&…

【雕爷学编程】Arduino动手做(148)---MD-PS002压力传感器模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

[解决方案] 在linux运行python代码报错(Illegal instruction (core dumped))

PVE修改CPU类型 在运行Python代码时遇到"Illegal instruction (core dumped)"错误时&#xff0c;意味着你的代码尝试在当前CPU架构不支持的指令上运行 1. 利用lscpu命令查看宿机和虚拟机CPU架构&#xff0c;确定宿机和虚拟机是否支持avx指令集 可以发现宿机是支持avx…

暑期学JavaScript【第四天】

日期对象 创建 //创建 const date new Date(); // 默认使用现在时间常用方法 时间戳的获取方式 date.getTime()new Date()Date.now() 倒计时案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta htt…

Redis初步认识

1、概述 redis是一款高性能的NOSQL系列的非关系型数据库&#xff1b; 2、什么是NOSQL&#xff1f; NOSQL(NoSQLNotOnlySQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库随着互联网web2.0网站的兴起&#xff0c;传统…

Java中常见的线程池以及ThreadPoolTaskExecutor和ThreadPoolExecutor

线程池的基本组成&#xff1a; 线程管理器&#xff1a;用于创建并管理线程池&#xff0c;负责线程池的创建、销毁以及任务的添加。 工作线程&#xff1a;线程池中的线程&#xff0c;负责执行任务&#xff0c;没有任务时处于等待状态。 任务接口&#xff1a;每个任务必须实现的…

gen1-视频生成论文阅读

文章目录 摘要贡献算法3.1 LDM3.2 时空隐空间扩散3.3表征内容及结构内容表征结构表征条件机制采样 3.4优化过程 实验结果结论 论文&#xff1a; 《Structure and Content-Guided Video Synthesis with Diffusion Models》 官网&#xff1a; https://research.runwayml.com/ge…

aliyun-oss-sdk阿里云OSS视频上传(断点续传)前端实现

问题背景 最近上传视频的功能&#xff0c;突然炸了&#xff0c;两年没动的代码&#xff0c;突然不行辽&#xff0c;首次上传成功&#xff0c;后面继续上传就可以&#xff0c;但凡有一次上传失败&#xff0c;再上传文件就不行。 这里博主使用的是凭证上传方式哈。 凭证上传 …

CMU 15-445 -- Hash Tables - 04

CMU 15-445 -- Hash Tables - 04 引言Hash TablesHash FunctionsHashing Scheme小结 Dynamic Hash TablesChained Hashing (链式哈希)Extendible Hashing(可扩展哈希)Linear Hashing(线性哈希) 总结 引言 本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅…

【IDA疑难杂症修复】

我们在使用IDA进行逆向分析的时候&#xff0c;会遇到一些问题&#xff0c;这篇文章来带领大家学习IDA中疑难杂症的修复&#xff1a;函数大小限制&#xff0c;栈不平衡&#xff0c;switch无法识别&#xff08;跳转表修复&#xff09;&#xff0c;ida Decompile as call。 一.函…

Redis学习(一)数据类型、Java中使用redis、缓存概念

文章目录 常用数据结构String类型Hash类型List类型Set类型SortedSet 类型 通用命令key的层级结构 Spring Data Redis快速入门RedisTemplate的序列化方式StringRedisTemplateRedisTemplate的Hash类型操作 实战操作短信登录发送验证码校验登录信息校验登录状态 商家查询缓存缓存更…

antdesignpro组件Upload传excel文件到后端flask的两种方案

&#xff08;特别提醒&#xff1a;后端xlrd新版本不支持xlsx文件&#xff0c;所以暂用xls文件进行上传&#xff09; 1.第一种方案&#xff1a;组件接收到excel文件,然后解析成list数据&#xff0c;解析是要用到XLSX&#xff08; 安装插件&#xff1a;npm i xlsx --save impor…

【Leetcode】21.合并两个有序链表

一、题目 1、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例2: 输入:l1 = [], l2 = [] 输出:[]示例3: 输入:l1 = [], l2 = [0] 输…

Cesium 常用标绘线、面、矩形、圆、曲面、曲线、攻击箭头、钳击箭头,标绘与修改。

前言&#xff1a;直接放效果图&#xff0c;符合就往下看&#xff0c;不符合出门右转。 由于篇幅有限&#xff0c;只贴出各个标绘的关键代码。 1、线段 基于坐标点&#xff0c;加载不同的材质。 //动态加载 const entity this._viewer.entities.add({polyline: {positions: …

K8S网络管理

这里写目录标题 1 网络管理1.1Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 1.3 flannel方案1.3.1 网络方案1.3.2 flannel1.3.3 主机网络 1 网络管理 1.1Service 1.1.1 网络体系 学习目标 这一…

Shell脚本 中运行sudo命令

在shell脚本中有时需要使用sudo进行提权&#xff0c;运行包含这类脚本的文件时通常需要我们在终端输入sudo密码&#xff0c;但是在一些无人值守的应用中显然就不太适合了。本文通过构建一个多用户的ubuntu操作环境&#xff0c;来展示脚本中需要使用sudo命令时的应用场景。 我们…

基于vue3+vite+ts,使用nexus发布组件库

1、前提条件 已部署nexus3&#xff0c;可参考&#xff1a; Ubuntu部署和体验Nexus3-腾讯云开发者社区-腾讯云 代理设置&#xff1a; 【Nexus】通过Nexus搭建Npm私库_猫巳的博客-CSDN博客 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一…