当前位置: 首页 > news >正文

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
​
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}

示例1

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例2

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示

  • 0 <= nums.length <= 100

  • 0 <= nums[i] <= 50

  • 0 <= val <= 100

⭐题目思路

这里还是提取一下题目的特征点:

  • 原地移除

原地移除,考虑用vector作为STL库中一员的erase函数,该函数可以在原数组中直接删除对应位置的元素,基本语法:

vector.erase(vector.begin()+i)//表示删除掉数组中下标为i的元素

这样的好处是无需额外的变量空间,但问题也随之产生:⭐原地删除后vector中的元素的下标会对应的发生变化,vector的长度也对应发生变化,那么就需要额外考虑下标的处理问题。大致有以下几个方面:

  • 删除掉下标为i的元素后,新一轮的for循环中下标为i的元素其实是还未被遍历过的,所以需要i--来遍历这个元素。

class Solution 
{
public:int removeElement(vector<int>& nums, int val) {for(int i=0;i<nums.size();i++){if(nums[i]==val) {nums.erase(nums.begin()+i);i--;}}return nums.size();}
};

该方法的执行用时和内存消耗如下图所示:

仍有进步的空间。

在之前调试的时候,我发现了一个很奇怪的现象,我在return前加了一句代码:

if(nums.size()==1&&nums[0]==val) return 0;

然后运行用时就变为了0ms,然后内存消耗反而增大了。这里我其实不是很理解,欢迎大佬们帮我解答一下,评论区见~

这道题也是有点典型的STL风,感兴趣的初学朋友可以去看一下~

⭐vector补充知识

vector还有一些常用的函数,这里补充一下:

//定义一个vector,类型为int
vector<int> a;
//定义一个int型长度为10的vector
vector<int> b(10);
//定义一个int型长度为10,初始值均为3的vector
vector<int> c(10,3);//将vector中的最后一个元素改成4
a.back()=4;
⭐(这个符号表示时间复杂度) O(1)
//清空vector
a.clear();
⭐ O(n)
//在vector末尾增加一个3
a.push_back(3);
⭐ O(1)
//删除末尾元素
a.pop_back();
⭐ O(1)//该部分比较少用,时间复杂度都为O(该变量)
//截取长度为11,缺的补0,不缺就直接截取
a.resize(11);
//截取长度为11,缺的补5
a.resize(11,5);//判断元素个数
a.size();
⭐ O(1)
//判断vector中是否无元素了,没有了就返回true
a.empty();
⭐ O(1)//vector作为迭代器
a.begin();//返回a的第一个元素的位置
a.end();//返回a的最后一个元素的下一个位置
sort(a.begin(),a.end());//插入删除,慎用,因为时间复杂度为O(n),有点慢
//在下标为2(从0开始)的位置插入0元素
a.insert(a.begin()+2,0);
//删除下标为2的元素
a.erase(a.begin()+2);
//删除区间,左闭右开
a.erase(a.begin()+1,a.begin()+4);

⭐一切会让vector长度变化的操作都可能让之前的迭代器失效,这也是该题目我们需要额外考虑的地方。

这里如果有不懂的地方欢迎评论区留言⭐~

⭐代码

class Solution 
{
public:int removeElement(vector<int>& nums, int val) {for(int i=0;i<nums.size();i++){if(nums[i]==val) {nums.erase(nums.begin()+i);i--;}}if(nums.size()==1&&nums[0]==val) return 0;return nums.size();}
};

提交结果

我的代码还有待改进,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!

点赞收藏不迷路⭐~

相关文章:

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…...

如何处理Android内存泄漏和性能优化

处理Android内存泄漏和性能优化是一个复杂的过程&#xff0c;涉及到对应用的深入理解和良好的编程习惯。以下是一些关键的步骤和建议&#xff1a; 1. **理解内存泄漏的本质**&#xff1a; - 内存泄漏&#xff08;Memory Leak&#xff09;发生在程序中&#xff0c;当不再需要…...

应用方案 | D722 9MHz,轨对轨I/O CMOS运放,低噪声、低电压、低功耗运放,应用广泛

D722是低噪声、低电压、低功耗运放&#xff0c;应用广泛。D722具有9MHz的高增益带宽积&#xff0c;转换速率为8.5V/μs&#xff0c;静态电流为1.7mA&#xff08;5V电源电压&#xff09;。 D722具有低电压、低噪声的特点&#xff0c;并提供轨到轨输出能力&#xff0c;D722的最大…...

小程序常用样式和组件

常用样式和组件 1. 组件和样式介绍 在开 Web 网站的时候&#xff1a; 页面的结构由 HTML 进行编写&#xff0c;例如&#xff1a;经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写&#xff0c;例如&#xff1a;经常会采用 .class 、#id 、element 等选择器…...

《Redis 设计与实现》读书概要

注&#xff1a; 《Redis 设计与实现》一书基于 Redis 2.9 版本编写&#xff0c;部分内容已过时&#xff0c;过时之处本文会有所说明。本文为读书笔记&#xff0c;部分简单和日常使用较少的知识点未记录。原书网页版地址 https://redisbook.com/ 一、底层数据结构 SDS(Simple Dy…...

Docker之数据卷自定义镜像

文章目录 前言一、数据卷二、自定义镜像 前言 Docker提供了一个持久化存储数据的机制&#xff0c;与容器生命周期分离&#xff0c;从而带来一系列好处&#xff1a; 总的来说Docker 数据卷提供了一种灵活、持久、可共享的存储机制&#xff0c;使得容器化应用在数据管理方面更加…...

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论&#xff08;4&#xff09; Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…...

【JAVA重要知识 | 第五篇】暴打Java8新特性—(Lambda、方法引用、Stream流、函数式接口、Date Time API、Optional类)

文章目录 5.Java8新特性5.1新特性列表5.2Lambda 表达式5.2.1函数式思想5.2.2举例&#xff08;1&#xff09;方式一&#xff1a;创建对象&#xff08;2&#xff09;方式二&#xff1a;匿名内部类&#xff08;3&#xff09;方式三&#xff1a;Lambda 5.2.3Lambda表达式的标准格式…...

Docker Swarm全解析:实现微服务高可用与故障转移的秘密武器

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker入门到精通》 《k8s入门到实战》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、基本概念和介绍 1、Docker Swarm 是什么&#xff0c;它与 …...

编码规范(前端)

文章目录 1. 文档说明1.1 编制说明1.2 名词解释 2.前端研发规范2.1 HTML编码规范2.1.1 文档类型2.1.2 语言2.1.3 元数据2.1.4 资源加载2.1.5 页面标题2.1.6 编码风格2.1.7 标签2.1.8 属性2.1.9 语义化 2.2 CSS编码规范2.2.1 文件引用2.2.2 命名-组成元素 知识点 1. 文档说明 1…...

【JavaEE进阶】部署Web项目到Linux服务器

文章目录 &#x1f343;前言&#x1f340;什么是部署&#x1f332;环境配置&#x1f6a9;数据准备&#x1f6a9;程序配置⽂件修改 &#x1f384;构建项目并打包&#x1f38b;上传Jar包到服务器,并运行&#x1f6a9;上传Jar包&#x1f6a9;运行程序&#x1f6a9;开放端口号 &…...

就业班 2401--3.1 Linux Day9--文件查找和压缩

一、文件查找与打包压缩 grep: 文件内容过滤 [rootqfedu.com ~]# grep root /etc/passwd #从/etc/passwd文件中过滤root字段 grep ^root root$ root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 查找命令 [rootqfedu.com ~]# which ls ali…...

「滚雪球学Java」:JDBC(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…...

RT-DETR改进RepVGG结构:简单但功能强大的卷积神经网络架构

💡本篇内容:RT-DETR改进RepVGG结构:简单但功能强大的卷积神经网络架构 💡🚀🚀🚀本博客 改进源代码改进 适用于 RT-DETR 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,RT-DETR专属 应部分读者要求,新增一篇RepVGG 论文理论部分 + 原…...

C#进阶高级语法之LINQ :Lambda 表达式

C# 中的 LINQ (Language Integrated Query) 提供了一种声明性的数据查询和操作方法&#xff0c;它允许开发人员对集合、数据库等数据源进行查询和操作&#xff0c;而不需要编写复杂的循环和手动编码。Lambda 表达式与 LINQ 紧密相关&#xff0c;它提供了一种简洁的方式来定义匿…...

react hook: useCallback

useCallback的主要使用场景在于优化性能&#xff0c;并确保当传递回调函数给子组件时&#xff0c;子组件不会因为父组件的重渲染而重新创建函数。 使用场景 1.当你需要将回调函数传递给子组件时&#xff0c;使用useCallback可以确保子组件在重新渲染时不会不必要地重新创建函数…...

java面试(jvm)

JVM内存模型 细分Eden&#xff1a; java类加载过程&#xff1f;双亲委派机制&#xff1f;一个对象从加载到JVM&#xff0c;再到被GC清除过程&#xff1f; JAVA类加载器&#xff1a;AppClassLoader - ExtClassLoader - BootStrapClassLoader。每种类加载器都有他自己的加载目录…...

自动化测试摸索:python+selenium+pytest(持续更新.....)

一、环境搭建 1、python 安装 下载链接&#xff1a;Python Releases for Windows | Python.org 自己选择合适的版本下载 当下载完毕时&#xff0c;找到该安装程序&#xff1a;python-3.12.2-amd64.exe文件&#xff0c;双击启动安装向导。 为了防止C:盘文件因系统故障或者无…...

C++惯用法之RAII思想: 资源管理

C编程技巧专栏&#xff1a;http://t.csdnimg.cn/eolY7 目录 1.概述 2.RAII的应用 2.1.智能指针 2.2.文件句柄管理 2.3.互斥锁 3.注意事项 3.1.禁止复制 3.2.对底层资源使用引用计数法 3.3.复制底部资源(深拷贝)或者转移资源管理权(移动语义) 4.RAII的优势和挑战 5.总…...

矢量图是什么,有哪些格式的文件

矢量图是一种图形设计中常用的图像类型&#xff0c;与我们日常见到的光栅图像&#xff08;如JPEG、PNG等&#xff09;有本质的区别。矢量图基于数学方程和几何元素&#xff08;如点、线、曲线和形状&#xff09;来表示图像&#xff0c;而不是像光栅图那样通过像素阵列来表示。这…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...