【面试经典150题】删除有序数组中的重复项Ⅱ JavaScript

题目来源。

给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

思路1:移动元素法。从后遍历数组,计数元素重复次数,当遇到不重复元素且重复数量大于2时,开始把后面子数组往前移,缩小数组长度。

/*** @param {number[]} nums* @return {number}*/
var compressArry = function (nums, i, j) {let n = nums.length;for (let k = i; k < n; k++) {nums[k - j] = nums[k];}nums.length -= j;
}
var removeDuplicates = function (nums) {let i = nums.length - 1,j = 1;while (i - j >= 0) {if (nums[i - j] !== nums[i]) {//这时候的j就是重复次数if (j > 2) {//将[i,nums.length-1]往前移j-2位compressArry(nums, i, j - 2);}//不管大于2还是小于等于2,i在这时都要移动到i-j,开始下一轮计数i = i - j;j = 1;} else {j++;}}//最前面的重复数还没有清理,现在开始清理if (j > 2) {//将[i,nums.length-1]往前移j-2位compressArry(nums, i, j - 2);}return nums.length;
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

思路2:重复次数达到3,立马删除。

/*** @param {number[]} nums* @return {number}*/
var removeDuplicates = function(nums) {if(nums.length<=2) return nums.length;let i=0,j=2;while(i<nums.length){if(nums[i]===nums[j]){nums.splice(j,1);}else{i++;j++;}}return nums.length;
}

时间复杂度:O(n2)

空间复杂度:O(1)

思路3:双指针法

/*** @param {number[]} nums* @return {number}*/
var removeDuplicates = function (nums) {if(nums.length<=2){return nums.length;}let slow=2;for(let fast=2;fast<nums.length;fast++){if(nums[fast]!==nums[slow-2]){//找到新元素nums[slow++]=nums[fast];}}nums.length=slow;return slow;
};

解释:slow指针保证了其前面的元素重复次数不超过2,fast指针则是向后寻找新元素,一旦找到新元素,将其插入到slow的位置。接着,slow指针往后移一位,fast继续寻找。如果fast找到数组末尾了,那么说明新元素寻找完毕,故设置数组长度为slow即为满足需要的数组。

时间复杂度:O(n)

空间复杂度:O(1)

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

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

相关文章

程序自动分析——并查集+离散化

在实现程序自动分析的过程中&#xff0c;常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本&#xff1a;假设 x1,x2,x3,… 代表程序中出现的变量&#xff0c;给定 n 个形如 xixj 或 xi≠xj 的变量相等/不等的约束条件&#xff0c;请判定是否可以分别为…

Matlab 生成一定信噪比的信号

文章目录 【 1. 信噪比 】【 2. 功率归一化 】2.1 实信号+实噪声2.2 实信号+复噪声【 3. 能量归一化 】3.1 实信号+实噪声3.2 实信号+复噪声【 4. 小结 】【 1. 信噪比 】 信噪比公式 1 : S N R = 10 ∗ l o g 10 P s P n 信噪比公式1:SNR=10*log_{10}\frac{P_s}{P_n} 信噪比…

webrtc的Sdp中的Plan-b和UnifiedPlan

在一些类似于视频会议场景下&#xff0c;媒体会话参与者需要接收或者发送多个流&#xff0c;例如一个源端&#xff0c;同时发送多个左右音轨的音频&#xff0c;或者多个摄像头的视频流&#xff1b;在2013年&#xff0c;提出了2个不同的SDP IETF草案Plan B和Unified Plan&#x…

【uniapp 上传图片示例】

以下是 uniapp 上传图片的详细步骤示例&#xff1a; 定义一个方法&#xff0c;用于选择图片并上传&#xff1a; methods: {chooseImage() {uni.chooseImage({count: 1, // 最多选择的图片数量sizeType: [original, compressed], // 可以指定原图或压缩图sourceType: [album, …

android framework之Applicataion启动流程分析

Application启动流程分析 启动方式一&#xff1a;通过Launcher启动app 启动方式二&#xff1a;在某一个app里启动第二个app的Activity. 以上两种方式均可触发app进程的启动。但无论哪种方式&#xff0c;最终通过通过调用AMS的startActivity()来启动application的。 根据上图…

ABeam×Startup | 德硕管理咨询(深圳)创新研究团队拜访微漾创客空间

近日&#xff0c;德硕管理咨询&#xff08;深圳&#xff09;&#xff08;以下简称&#xff1a;“ABeam-SZ”&#xff09;创新研究团队前往微漾创客空间&#xff08;以下简称&#xff1a;微漾&#xff09;拜访参观&#xff0c;并展开合作交流。会议上&#xff0c;双方相互介绍了…

每日一题 57. 插入区间

读研了&#xff0c;开始用python刷题 今天的题目是力扣 每日一题 57. 插入区间 难度&#xff1a;中等 思路&#xff1a; 处理新区间起点&#xff0c;要么在两个老区间之间&#xff0c;要么被一个老区间包含处理新区间中点&#xff0c;同起点一样 我的代码如下 class Solut…

解锁市场进入成功:GTM 策略和即用型示例

在最初的几年里&#xff0c;创办一家初创公司可能会充满挑战。根据美国小企业管理局的数据&#xff0c;大约三分之二的新成立企业存活了两年&#xff0c;几乎一半的企业存活了五年以上。导致创业失败的因素有市场需求缺失、资金短缺、团队不合适、成本问题等。由此&#xff0c;…

合宙Air724UG LuatOS-Air LVGL API控件--按钮 (Button)

按钮 (Button) 按钮控件&#xff0c;这个就不用多说了&#xff0c;界面的基础控件之一。 示例代码 – 按键回调函数 event_handler function(obj, event) if event lvgl.EVENT_CLICKED then print(“Clicked\n”) elseif event lvgl.EVENT_VALUE_CHANGED then print(“To…

服务器数据库中了locked勒索病毒怎么办,locked勒索病毒恢复工具

最近一段时间网络上的locked勒索病毒非常嚣张&#xff0c;自从6月份以来&#xff0c;很多企业的计算机服务器数据库遭到了locked勒索病毒的攻击&#xff0c;起初locked勒索病毒攻击用友畅捷通T用户&#xff0c;后来七月份开始攻击金蝶云星空客户&#xff0c;导致企业的财务系统…

揭秘视频号创收计划:松松一个月赚1300+

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 这是卢松松一个月视频号的收益&#xff0c;1300元。自从视频号在五月份推出创作者分成计划以来&#xff0c;许许多多的视频号创作者开始获得了一些收益&#xff0c;这绝对是一项挺不错的进展。 目前…

算法通关村第十六关——滑动窗口与堆结合

LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位&#xff0c;返回滑动窗口中的最大值。 输入&#xff1a;nums[1,3,-1,-3,5,3,6,7],k3 输出&#xff1a;[3,3,5,5,…

Pytorch模型转ONNX模型并使用ONNXRuntime运行

Pytorch模型转ONNX模型 import torch import torch.nn as nn from backbone import OXI_Netmodel OXI_Net() # 实例化模型对象 model.load_state_dict(torch.load(./cnn_model_50.pth)) # 加载模型 model.eval() # 推理模式input_names [image] # 输入名称 output_names…

R-Meta分析核心技术教程

详情点击链接&#xff1a;全流程R-Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文献纳入排除标准 …

回归预测 | MATLAB实现TSO-ELM金枪鱼群优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现TSO-ELM金枪鱼群优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现TSO-ELM金枪鱼群优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效…

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis&#xff1a;打通上层应用与底层计算引擎的数据中间件 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件&#xff0c;用于解决前台各种工具、应用&#xff0c;和后台各种…

proxysql使用心得

proxySQL 多层配置系统结构 -------------------------| RUNTIME |-------------------------/|\ || |[1] | [2] || \|/-------------------------| MEMORY |------------------------- _/|\ | …

无锁并发:探秘CAS机制的魔力

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 无锁并发&#xff1a;探秘CAS机制的魔力 ⏱️ 创作时间&#xff1a; 2…

this.viewer.entities.removeById()循环删除为什么删除不完

在 Cesium 中&#xff0c;viewer.entities.removeById() 方法用于从场景中移除指定 ID 的实体。如果您在循环中使用这个方法来删除多个实体&#xff0c;有可能会出现删除不完全的问题&#xff0c;这是因为在删除实体的同时&#xff0c;实体数组的长度在不断减小&#xff0c;可能…

对java中的List进行深拷贝,并进行删除测试

List<String> list new ArrayList<>(); // 需要拷贝的原始List list.add("aaa"); list.add("bbb"); list.add("ccc"); List<String> listNew new ArrayList<>(); // 新List // 将原始List的值赋值给新List Co…