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

news2024/11/17 3:30:34

⭐今日份题目

给你一个数组 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();
    }
};

提交结果

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

点赞收藏不迷路⭐~

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

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

相关文章

更新至2023年,上市公司ESG数据合集(四份数据:盟浪、华证、商道融绿、富时罗素)

更新至2023年&#xff0c;上市公司ESG数据合集&#xff08;四份数据&#xff1a;盟浪、华证、商道融绿、富时罗素&#xff09; 1、时间&#xff1a; 富时罗素ESG评分&#xff1a;2018-2023年 华证ESG评级&#xff1a;2009-2023年 盟浪ESG评级&#xff1a;2014-2023 商道融…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

数码管的动态显示(一)

1.原理 把每一个数码管闪烁的时间设置为1ms&#xff0c;肉眼观察不到就会认为6个数码管在同时闪烁。 实验目标&#xff1a; 使用6位8段数码管实现数码管的动态显示&#xff0c;显示的内容就是0-999_999。当计数到最大值&#xff0c;让他归零&#xff0c;然后循环显示。每0.1秒…

【嵌入式移植】8、U-Boot源码分析5—启动过程分析start.S

U-Boot源码分析5—启动过程分析start.S 1、boot0.h2、reset2.1、vectors2.2、ELn2.2.1 EL32.2.2、EL2、EL1 2.3、SMPEN2.3、core errate2.4、lowlevel_init 前面从U-Boot编译的角度分析了其Makefile、链接脚本等&#xff0c;本章开始正式分析U-Boot启动过程 从上一篇文章7、U-…

30天JS挑战(第十六天)----鼠标拖影效果

第十六天挑战(鼠标拖影效果) 地址&#xff1a;https://javascript30.com/ 所有内容均上传至gitee&#xff0c;答案不唯一&#xff0c;仅代表本人思路 中文详解&#xff1a;https://github.com/soyaine/JavaScript30 该详解是Soyaine及其团队整理编撰的&#xff0c;是对源代…

20 个不同的 Python 函数实例

Python 是一种广泛使用的高级编程语言&#xff0c;其函数是 Python 编程中至关重要的概念之一。函数是一段可以重复使用的代码块&#xff0c;可以接收输入参数并返回输出结果。使用函数能够提高代码的可读性、可维护性和重用性。 基础知识 在 Python 中&#xff0c;函数使用关…

[动态规划]---part1

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

LeetCode-02

225. 用队列实现栈 用两个队列实现栈的功能&#xff0c;思路如下&#xff1a; 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列&#xff0c;直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…

thymeleaf 一个莫名其妙的错误提示 org.attoparser.ParseException

thymeleaf 一个莫名其妙的错误提示 介绍 开发过程中遇到一个莫名奇妙的错误&#xff0c;一时竟然不知道怎么解决&#xff0c;找官网也没有找到 问题 页面显示 错误日志 org.attoparser.ParseException: (Line 96, Column 5) Malformed markup: Attribute “}” appears m…

医学大数据|统计基础|医学统计学(笔记):开学说明与目录

开始学习统计基础&#xff0c;参考教材&#xff1a;医学统计学第五版 点点关注一切来学习吧 责任编辑&#xff1a;医学大数据刘刘老师&#xff1a;头部医疗大数据公司医学科学部研究员 邮箱&#xff1a;897282268qq.com 久菜盒子工作室 我们是&#xff1a;985硕博/美国全奖…

【开源】SpringBoot框架开发数据可视化的智慧河南大屏

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏&#xff0c;包含了GDP、…

js面试 forEach ,map,for ,for in , for of

forEach ,map&#xff0c;for ,for in , for of 1 forEach 回调3个参数value&#xff0c;index&#xff0c;arr&#xff08;原数组&#xff09; 2 map 1&#xff1a;map() 不会改变原始数组 2&#xff1a;函数的作用是对数组中的每一个元素进行处理&#xff0c;返回新的元素…

动态规划(算法竞赛、蓝桥杯)--背包DP求具体方案

1、B站视频链接&#xff1a;E20 背包DP 求具体方案_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int v[N],w[N]; int f[N][N],p[N][N];int main(){int n,m;cin>>n>>m;for(int i1;i<n;i)cin>>v[i]>>w[i…

cmd模式下启动mysql

1.打开cmd输入services.msc&#xff0c;找到MYSQL&#xff0c;右击属性&#xff0c;找到可执行文件路径&#xff0c;加载到环境变量。 2.打开cmd&#xff0c;启动MYSQL&#xff1a;输入net start mysql; 3.登陆MYSQL&#xff0c;需要管理权限&#xff1b; 输入&#xff1a;my…

day34贪心算法 part03

1005. K 次取反后最大化的数组和 简单 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数…

达梦数据库查询语句内存溢出问题解决

背景&#xff1a;达梦数据库使用过程中&#xff0c;某天突然服务宕机&#xff0c;导致各类后端服务无法注册到nacos上&#xff0c;重启之后nacos正常启动&#xff0c;可执行一条两千多条数据量的连表查询时间很长&#xff0c;甚至会报错&#xff0c;经查看日志发现在查询过程中…

【InternLM 笔记】使用InternStudio 体验书生·浦语2-chat-1.8b随记

书生浦语2-chat-1.8b 介绍 书生浦语-1.8B (InternLM2-1.8B) 是第二代浦语模型系列的18亿参数版本。为了方便用户使用和研究&#xff0c;书生浦语-1.8B (InternLM2-1.8B) 共有三个版本的开源模型&#xff0c;他们分别是&#xff1a; InternLM2-1.8B: 具有高质量和高适应灵活性…

找不到emp.dll如何处理?emp.dll丢失的多种的解决方法分享

在计算机游戏中&#xff0c;当特定的核心文件emp.dll发生丢失时&#xff0c;可能会引发一系列影响游戏运行的问题。由于emp.dll通常是游戏运行所必需的动态链接库文件&#xff0c;它的缺失会导致游戏无法正常启动或加载&#xff0c;玩家可能面临“无法进入游戏”的尴尬境地。其…

AI技术初探:普通人ALL IN AI入门指南

自从去年ChatGPT如流星划过夜空&#xff0c;照亮了整个AI领域&#xff0c;它所带来的技术革新与热潮仿佛一场无声的暴风雨&#xff0c;席卷了全球的科技圈。身为一名低阶IT从业者&#xff0c;感觉这太高大上了&#xff0c;与我的工作有毛线关系。 但是&#xff0c;AI技术的飞速…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】链表—双向链表

目录 往期 1 -> 带头双向循环链表(双链表) 1.1 -> 接口声明 1.2 -> 接口实现 1.2.1 -> 双向链表初始化 1.2.2 -> 动态申请一个结点 1.2.3 -> 双向链表销毁 1.2.4 -> 双向链表打印 1.2.5 -> 双向链表判空 1.2.6 -> 双向链表尾插 1.2.7 -&…