Leetcode26——引出c++ vector中erase()的内部原理

erase是对数组中某个元素进行删除的操作,实际的时间复杂度为O(n)

预备知识

数组在内存中是连续存储的,删除某个位置的时候不能直接删除,只能用后序的元素覆盖
在这里插入图片描述
以nums数组为例,target为需要删除的目标数据

方法:

①暴力删除法:

每次遇到一个目标删除数据,后续的元素都要往前移动替代它
时间复杂度为O(n^2)
在这里插入图片描述

int del(vector<int> nums, int target){int size = nums.size();for(int i = 0; i < nums.size(); i++){//如果i所指元素为目标元素,则用后序元素替代if(nums[i] == target){for(int j = i+1; j < nums.size(); j++)nums[j-1] = nums[j];i--;//因为nums[i]已经被后序元素替代了,需要重新检查,所以回退一个size--;//数组的长度缩小一个}}return size;//返回数组的最终大小
}

②双指针法

时间复杂度:O(n)
思路
初始化两个指针
①慢指针逐个前进,表示下一个可使用的位置
②快指针指向第一个不等于目标值的位置
不断用快指针位置的值覆盖慢指针位置的值
相当于将非目标值的元素都堆到最前面
最后,fast走完整个数组,slow指的位置就是非目标值元素的个数,即size
在这里插入图片描述
代码

int del(vector<int> nums, int target){int slowindex = 0;for(int fastindex = 0; fastindex < nums.size(); fastindex++){//如果快指针非目标删除元素,放到前面if(nums[fastindex] != target){nums[slowindex++] = nums[fastindex];}return slowindex;//返回数组的最终大小
}

【注】
在不要求保证原数组顺序的情况下,也可以两指针相向而行,用后面的元素替代前面的

T26-题目

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

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 非严格递增 排列

T26-解答

class Solution {
public://从slow开始删除target元素int delFiction(vector<int>& nums, int target, int size, int slow, int fast){//这里的size得是删除过后的sizefor(; fast < size; fast++){if(nums[fast] != target){nums[slow++] = nums[fast]; }}return slow;}int removeDuplicates(vector<int>& nums) {int size = nums.size();for(int i = 0; i< size; i++){//如果当前元素和下一个元素一样,就认为重复了if(i < size - 1 && nums[i] == nums[i+ 1] ){size = delFiction(nums, nums[i], size, i+1, i+1);i--;}}return size;}
};

相似题目:

T283

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

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

相关文章

codeforces (C++ Satisfying Constraints)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、找到最大的下限min 2、找到最小的上限max 3、则max-min1满足1、2约束条件的个数 4、max-min1减去约束条件3的个数&#xff0c;即为最终答案 5、如果min大于max&#xff0c;则结果为0&#xff0c;不存在满足约束条件的数…

【天龙怀旧服】攻略day7

关键字&#xff1a; 新星1.49、金针渡劫、10灵 1】新星&#xff08;苍山破煞&#xff09; 周三周六限定副本&#xff0c;19.00-24.00 通常刷1.49w&#xff0c;刷149点元佑碎金 boss选择通常为狂鬼难度&#xff0c;八风不动即放大不选&#xff0c;第二排第一个也不选&#xf…

RSIC-V“一芯”学习笔记(二)——Linux入门教程

文章目录 一、前言二、Busybox套件三、重要的追踪工具——strace四、Shell五、正则表达式六、重定向&#xff08;多次输入测试时&#xff09;七、一些组合命令八、自动化脚本九、学会查阅十、亲&#xff08;yuan&#xff09;近(li) bai du十一、不要逃避困难十二、重视小问题 一…

Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合

文章目录 背景知识补充CLIP (Contrastive Language-Image Pre-training)&#xff1a;打破文字和图像之间的壁垒DINO(Data-INterpolating Neural Network)&#xff1a;视觉 Transformer 的自监督学习Stable Diffusion&#xff1a;从文本描述中生成详细的图像Open-set Detector开…

分布式事务2PC、3PC

1、概念 分布式事务的二阶段提交&#xff08;Two-Phase Commit, 2PC&#xff09;和三阶段提交&#xff08;Three-Phase Commit, 3PC&#xff09;是用于处理分布式系统中事务一致性的两种不同的协议。这两种协议的主要区别在于其阶段数和容错性。 二阶段提交&#xff08;2PC&am…

Vue生成图片并下载

一、安装 html2canvas 在项目安装库 html2canvas npm i html2canvas 二、生成图片 在页面局部加载 html2canvas 库&#xff0c;调用方法生成 <template><div class"page-box"><div class"text-box">文本转图片</div></div>…

【教3妹学编程-算法题】最大频率元素计数

2哥 : 3妹&#xff0c;最近有个电视剧《繁花》非常火&#x1f525;&#xff0c;你听说了吗&#xff1f; 3妹&#xff1a;没有&#xff0c;最近一直在忙着找工作&#xff0c;哪有时间看电视啊 2哥 : 啊&#xff1f;大周末还不休息一下啊&#xff0c;这么辛苦。 3妹&#xff1a;当…

Video接口介绍

屏库 https://m.panelook.cn/index_cn.php Open LDI, open lvds display interface OpenLDI and LVDS是兼容的&#xff0c; 是一种电平 https://www.ti2k.com/178597.html MIPI DSI/Camera crosLink FPD-LINK(Flat panel display link)是National(TI) LVDS技术&#xff0c; …

如何在线生成App:将网页封装成APP

在数字化时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;对于众多企业和个人开发者来说&#xff0c;开发一个原生App既耗时又耗资&#xff0c;尤其当他们已经拥有一个功能完备的网站时。幸运的是&#xff0c;现在有一种方法可以将现有的网页封装成…

k8s node节点加入集群,token过期

1、master01节点执行 kubeadm token create --print-join-command 2、执行命令 kubeadm join 192.168.0.236:16443 --token qucd8q.hsfq4a1afluzaky3 --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195 3、查看node02…

银行家算法/Banker‘s Algorithm

银行家算法&#xff08;Bankers Algorithm&#xff09;是一个避免死锁&#xff08;Deadlock&#xff09;的著名算法&#xff0c;由艾兹格迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础&#xff0c;判断并保证系统的安全运行。…

【含完整代码】Java定时任务之xxl-job[超详细]

前言 个人博客&#xff1a;www.wdcdbd.com 在Java中使用定时任务是一件很常见的事情&#xff0c;比如使用定时任务在什么时间&#xff0c;什么时候&#xff0c;去发布一些信息&#xff0c;或者去查询一些日志等相关的代码。这时&#xff0c;我们就要开发定时任务这中功能来实现…

PyGWalker,一款超级强大的数据分析和数据可视化的工具库

PyGWalker可以有效简化Jupyter笔记本的数据分析和数据可视化工作流程&#xff0c;方法是将panda数据帧转换为Tableau风格的用户界面进行可视化探索。 PyGWalker被命名为“Graphic Walker的Python绑定”的缩写。它集成了Jupyter笔记本&#xff08;或其他基于Jupyter的笔记本&am…

LeetCode83. Remove Duplicates from Sorted List

文章目录 一、题目二、题解 一、题目 Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well. Example 1: Input: head [1,1,2] Output: [1,2] Example 2: Input: head [1,1…

跳跃游戏【贪心】

Problem: 55. 跳跃游戏 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 简单模拟一下就行。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution:def canJump(self, nums: List[int]) -> bool:jump_max 1for i, num…

Linux之静态库和动态库

目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前&#xff0c;我们讲了静态库和动态库&#xff0c;详情请跳转&#xff1a;静态库和动态库 下面我们将从工程师的角度&#xff0c;去了解静态库和动态库的形成过程&#xff0c;以…

vue3 使用 jsoneditor

vue3 使用 jsoneditor 在main.js中引入 样式文件 import jsoneditor/dist/jsoneditor.css复制代码放到文件中就能用了 jsoneditor.vue <template><div ref"jsonDom" style"width: 100%; height: 460px"></div> </template> <…

什么是uni.request()?如何使用它?

uni.request()是uni-app提供的一个用于发起网络请求的API。 使用uni.request()的步骤如下&#xff1a; 在需要发起网络请求的页面中引入uni.request()方法。 调用uni.request()方法&#xff0c;并传入相应的参数&#xff0c;包括请求地址、请求方法、请求头部和请求数据等。 …

【Linux操作】国产Linux服务管理操作

【Linux操作】国产Linux服务管理操作 前言SAMBA配置服务器端1. 安装相关包2. 配置/etc/samba/smb.conf&#xff0c;在此文件末尾添加如下内容&#xff0c;并保存退出。3. 创建/home/share并更改权限4. 启动samba服务 客户端• Windows客户端• 麒麟客户端 Telnet1、telnet语法2…

Flink State 状态管理

文章目录 前言一、状态分类二、keyed代码示例ListStateMapState 总结 前言 状态在Flink中叫做State&#xff0c;用来保存中间计算结果或者缓存数据。要做到比较好的状态管理&#xff0c;需要考虑以下几点内容&#xff1a; 状态数据的存储和访问 在Task内部&#xff0c;如何高…