04-删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

方法一 

function removeDuplicates(nums: number[]): number {if (nums.length === 0) {return 0;}// 初始化慢指针,指向第一个元素let slow = 0;// 快指针从第二个元素开始遍历数组for (let fast = 1; fast < nums.length; fast++) {if (nums[fast]!== nums[slow]) {// 当快指针指向的元素与慢指针指向的元素不同时// 慢指针前进一位slow++;// 将快指针指向的元素赋值给慢指针指向的位置nums[slow] = nums[fast];}}// 慢指针加 1 即为不重复元素的数量return slow + 1;
}// 示例调用
const nums = [1, 1, 2];
const k = removeDuplicates(nums);
console.log("不重复元素的数量:", k);
console.log("去重后的数组前 k 个元素:", nums.slice(0, k));

代码解释

  1. 边界条件检查

    • 如果数组 nums 的长度为 0,直接返回 0,因为没有元素需要处理。
  2. 初始化指针

    • slow 指针初始化为 0,用于标记不重复元素的位置。
    • fast 指针初始化为 1,用于遍历数组。
  3. 遍历数组

    • 使用 for 循环,让 fast 指针从数组的第二个元素开始遍历。
    • nums[fast] 不等于 nums[slow] 时,说明遇到了一个新的不重复元素。
    • slow 指针向后移动一位,并将 nums[fast] 的值赋给 nums[slow]
  4. 返回结果

    • 遍历结束后,slow + 1 就是不重复元素的数量,将其返回。

复杂度分析

  • 时间复杂度:\(O(n)\),其中 \(n\) 是数组的长度。只需要遍历数组一次。
  • 空间复杂度:\(O(1)\),只使用了常数级的额外空间。

这种双指针法的思路是,slow 指针用于记录不重复元素的位置,fast 指针用于遍历数组,当遇到不重复元素时,将其放到 slow 指针指向的位置。这样可以在不使用额外空间的情况下,原地删除重复元素。

其他方法(拓展一下,但是不复合题意)

1. 使用 Set 进行去重

Set 是 JavaScript 中一种数据结构,它只会存储唯一的值。以下是使用 Set 去重的示例代码:

function nonInPlaceRemoveDuplicates(nums: number[]): number[] {return [...new Set(nums)];
}const nums = [1, 1, 2, 2, 3];
const result = nonInPlaceRemoveDuplicates(nums);
console.log(result); 

在这个例子中,代码将数组 nums 转换为 Set 来去除重复元素,然后再将 Set 转换回数组。但这里的问题是,它创建了一个新的数组,并没有对原数组进行原地修改,不符合本题的要求。

 2. 使用 filter 方法去重

function nonInPlaceRemoveDuplicatesByFilter(nums: number[]): number[] {return nums.filter((value, index, self) => {return self.indexOf(value) === index;});
}const nums2 = [1, 1, 2, 2, 3];
const result2 = nonInPlaceRemoveDuplicatesByFilter(nums2);
console.log(result2); 

同样,filter 方法会返回一个新的数组,原数组 nums 不会被修改,也不满足本题原地修改的条件。

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

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

相关文章

结合个人经历谈谈企业数字化

转眼间专注于从事企业数字化转型的工作已经3年。在这之前我做了8年的开发工作&#xff0c;8年间从最开始的软件开发岗位到高级开发工程师&#xff0c;再到资深开发工程师&#xff0c;主要使用的语言是java&#xff0c;其次js、python、存储过程plsql等。因为各种原因&#xff0…

Linux(20)——调度作业

目录 一、调度延迟的用户作业&#xff1a; 1、延迟的用户作业&#xff1a; 2、查看延迟的用户作业&#xff1a; 3、从计划中删除作业&#xff1a; 二、调度周期性用户作业&#xff1a; 1、周期性用户作业&#xff1a; 2、调度周期性用户作业&#xff1a; 3、用户作业格…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…

DeepSeek从入门到精通教程PDF清华大学出版

DeepSeek爆火以来&#xff0c;各种应用方式层出不穷&#xff0c;对于很多人来说&#xff0c;还是特别模糊&#xff0c;有种雾里看花水中望月的感觉。 最近&#xff0c;清华大学新闻与传播学院新媒体研究中心&#xff0c;推出了一篇DeepSeek的使用教程&#xff0c;从最基础的是…

Filter -> MaskFilter遮罩滤镜详解

MaskFilter 作用对象&#xff1a;MaskFilter 主要用于Paint的外观效果&#xff0c;给用Paint绘制的内容添加模糊或者浮雕效果应用效果&#xff1a; MaskFilter 处理位图的遮罩效果&#xff0c;影响绘制的边缘或整体形状主要用于模糊处理、浮雕效果等&#xff0c;通过影响绘制对…

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…

晶闸管的静态与开关特性

1. 静态特性 晶闸管的静态特性,是指晶闸管承受变化率较小的正向/反向阳极电压与漏电流之间的关系(即伏安特性),可使它导通的门极电压与电流之间的关系(即门极特性)和正向通态电流与电压之间的关系(即通态特性)。 位于第一象限的是正向特性。当门极开路时()时,…

基于机器学习时序库pmdarima实现时序预测

目录 一、Pmdarima实现单变量序列预测1.1 核心功能与特性1.2 技术优势对比1.3 python案例1.3.1 时间序列交叉验证1.3.1.1 滚动交叉验证1.3.1.2 滑窗交叉验证 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 基于VARMAX模型的多变量时序数据预测 基于机器学习时序库…

Naive UI去掉n-select下拉框边框,去掉n-input输入框边框

1、第一种通过js去掉 <template><div><div style"margin-top:10px;width: 100%;"><dade-descriptions><tr><dade-descriptions-item label"代理名称"><dade-input placeholder"代理名称"></dade-…

Qwen2-VL-2B-Instruct 模型 RK3576 板端部署过程

需要先在电脑上运行 RKLLM-Toolkit 工具&#xff0c;将训练好的模型转换为 RKLLM 格式的模型&#xff0c;然后使用 RKLLM C API 在开发板上进行推理。 在安装前先查看板端的内存容量&#xff0c;和自己模型占用大小比较一下&#xff0c;别安装编译好了不能用。 这里我就是先尝试…

【C语言标准库函数】双曲函数:sinh(), cosh(), tanh()

目录 一、头文件 二、函数简介 2.1. 双曲正弦函数 sinh(double x) 2.2. 双曲余弦函数 cosh(double x) 2.3. 双曲正切函数 tanh(double x) 三、函数实现&#xff08;概念性&#xff09; 四、注意事项 4.1. 参数类型 4.2. 计算精度 4.3. 函数返回值 4.4. 环境差异 4.…

(五)QT——QDialog 对话框

目录 前言 QDialog 主要功能 QDialog 使用方法 基本QDialog 应用程序级别的模态对话框 标准对话框 示例代码 功能展示 总结 1. 基本功能 2. 创建方式 3. 常用方法 前言 QDialog 是 Qt 框架中的对话框类&#xff0c;用于创建模态&#xff08;modal&#xff09;或非…

python 语音识别方案对比

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...

全文链接&#xff1a;https://tecdat.cn/?p39656 本文围绕基于TensorFlow实现的神经网络对抗训练域适应方法展开研究。详细介绍了梯度反转层的原理与实现&#xff0c;通过MNIST和Blobs等数据集进行实验&#xff0c;对比了不同训练方式&#xff08;仅源域训练、域对抗训练等&am…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中&#xff0c;协议号89 头部数据包内容&#xff1a; 版本(Version):对于OSPFv2&#xff0c;该字段值恒为2(使用在IPV4中)&#xff1b;对于OSPFv3&#xff0c;该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…

数据结构及排序算法

数据结构 线性结构 ◆线性结构:每个元素最多只有一个出度和一个入度,表现为一条线状。线性表按存储方式分为顺序表和链表。 存储结构: ◆顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻。 ◆链式存储:存储各数据元素的结点…

python实现多路视频,多窗口播放功能

系列Python开发 文章目录 系列Python开发前言一、python实现多路视频播放功能二、代码实现1. http申请视频流地址并cv2播放功能 三、打包代码实现生成可执行文件 总结 前言 一、python实现多路视频播放功能 服务端开发后通常需要做功能测试、性能测试&#xff0c;通常postman、…

【R语言】数据操作

一、查看和编辑数据 1、查看数据 直接打印到控制台 x <- data.frame(a1:20, b21:30) x View()函数 此函数可以将数据以电子表格的形式进行展示。 用reshape2包中的tips进行举例&#xff1a; library("reshape2") View(tips) head()函数 查看前几行数据&…