【LeetCode】27. 移除元素(简单)——代码随想录算法训练营Day01

题目链接:27. 移除元素

题目描述

给你一个数组 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

文章讲解:代码随想录

视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

题解1:暴力法

思路:用一个变量记录当前遍历的位置,用一个新变量查找下一个非目标值的位置,将用此值前移覆盖要删除的元素。

/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let i = j = 0;// 变量 i 记录当前检索位置,变量 j 查找下一个非目标值的位置while (i < nums.length) {if (nums[i] === val) {// 遇到要删除的元素,查找下一个不需要删除的元素的位置while (nums[j] === val) {j++;}if (j === nums.length) {return i; // 查找到数组末尾,返回 i}nums[i] = nums[j]; // 将不删除的元素前移覆盖要删除的元素nums[j] = val; // 将 j 位置标记为要删除元素的位置}i++;j++;}return i; // 查找结束,返回 i
};

分析:此解法虽然看起来用了双层循环,但实际 i 遍历 和 j 变量都只遍历了1次数组,时间复杂度为 O(n),空间复杂度为 O(1)。此方法没有改变原数组元素的顺序。

题解2:快慢指针法

定义快慢指针:

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新新数组下标的位置
/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let i = 0; // 慢指针,记录当前位置for (let j = 0; j < nums.length; j++) {// 快指针,查找下一个非目标值if (nums[j] !== val) {nums[i++] = nums[j]; // 将非目标值前移,且慢指针自增}}return i; // 返回慢指针位置,即为移除元素后新数组元素的个数
};

分析:使用双指针法,只需遍历一次数组,时间复杂度为 O(n),空间复杂度为 O(1)。此方法没有改变原数组元素的顺序。

题解3:相向双指针法

思路:题目中提到元素顺序可以改变,因此可以使用相向双指针法从数组的两边来遍历数组。左边寻找等于目标值的元素,右边寻找不为目标值的元素,交换位置得到新数组。

/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let left = 0, right = nums.length - 1;while (left <= right) {// 从左边找等于 val 的元素while (left <= right && nums[left] !== val) {left++;}// 从右边找不等于 val 的元素while (left <= right && nums[right] === val) {right--;}// 右边覆盖左边if (left < right) {nums[left++] = nums[right--];}}return left; // left 此时是新数组最后一个元素的下一个位置,即为新数组长度
};

分析:使用相向双指针法,只需遍历一次数组,时间复杂度为 O(n),空间复杂度为 O(1)。此方法改变了原数组元素的顺序。

收获

初次体验了快慢指针法和相向双指针法这两种双指针法的使用,并理解了它们的原理。

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

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

相关文章

Promise基础详细介绍(一),resolve,reject

Promise的含义 就是一个对象&#xff0c;用来传递异步操作的消息。 基本用法 resolve,reject是javascript引擎提供的。 const promise new Promise(function(resolve, reject) {const result {success: truevalue: 777} //伪代码&#xff0c;比如接口返回的参数if(result.su…

Vue 自定义仿word表单录入之日期输入组件

因项目需要&#xff0c;要实现仿word方式录入数据&#xff0c;要实现鼠标经过时才显示编辑组件&#xff0c;预览及离开后则显示具体的文字。 鼠标经过时显示 正常显示及离开时显示 组件代码 <template ><div class"paper-input flex flex-col border-box "…

物流实时数仓DWD层——1.准备工作

目录 1.创建主程序——DwdOrderRelevantApp类 2.创建DWD层的事实表——来源于订单表和订单明细表 (1)创建订单表实体类 (2)创建订单明细表实体类 (3)创建交易域&#xff1a;下单事务事实表实体类&#xff0c;并整合(1)与(2)&#xff0c;采用下单时间 (4)创建交易域&#…

【C++】STL(标准模板库)

文章目录 1. 基本概念2. 容器2.1. 容器的分类 1. 基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库)是惠普实验室开发的一系列软件的统称&#xff0c;现在已经成为C标准库的重要组成部分。STL的从广义上讲分为三类&#xff1a;algorithm&#xff08;…

Matlab字符识别实验

Matlab 字符识别OCR实验 图像来源于屏幕截图&#xff0c;要求黑底白字。数据来源是任意二进制文件&#xff0c;内容以16进制打印输出&#xff0c;0-9a-f’字符被16个可打印字符替代&#xff0c;这些替代字符经过挑选&#xff0c;使其相对容易被识别。 第一步进行线分割和字符…

AI编程可视化Java项目拆解第一弹,解析本地Java项目

之前分享过一篇使用 AI 可视化 Java 项目的文章&#xff0c;同步在 AI 破局星球、知乎、掘金等地方都分享了。 原文在这里AI 编程&#xff1a;可视化 Java 项目 有很多人感兴趣&#xff0c;我打算写一个系列文章拆解这个项目&#xff0c;大家多多点赞支持~ 今天分享的是第一…

如何巧妙处理情绪化,让生活工作保持积极心态分享

目录 前言 1、首先&#xff0c;要认识到情绪化对我们生活工作带来的负面影响。 2、要处理情绪化&#xff0c;首先要学会观察自己的情绪。 3、其次&#xff0c;我们要学会换位思考。 4、与亲朋好友分享心情。 5、最后&#xff0c;培养自己的兴趣爱好。 前言 在这个快节奏、…

nestjs中@Injectable()的实现原理

以下是对@Injectable()的简单实现 import reflect-metadata;function Injectable() {return function (constructor: Function) {Reflect.defineMetadata(injectable, true, constructor);}; }class DependencyInjectionContainer {private instances = new Map();getInstance&…

alibaba学习笔记03(小滴课堂)

自定义Ribbon负载均衡策略实战 启动3个视频服务和一个订单服务&#xff1a; 我们可以看到它是随机调用的。 也可以使用其他负载均衡策略。 讲解新一代负载均衡组件feign介绍 这种方式去写死接口肯定是不妥当的。 于是我们使用feign负载均衡组件&#xff1a; 改造微服务 集成F…

【Linux】 系统目录结构

进入到根目录 cd /ls目录名具体作用/存放系统系统相关的目录文件/boot放置linux系统内核文件和启动时用到的一些引导文件/home包含linux系统上各用户的主目录&#xff0c;子目录名称默认以该用户名命名/root系统管理员root的家目录/bin包含常用的命令文件&#xff08;如ls 等&a…

CBA业务架构师认证考试含金量

CBA业务架构师认证考试的含金量主要体现在以下几个方面&#x1f447; 1️⃣权威性 &#x1f48e;CBA业务架构师是业务架构师协会提供了一项国际认证计划&#xff0c;该计划可以衡量业务架构师的能力&#xff0c; 并向证明公认的熟练程度的个人授予认证业务架构师(Certified Bus…

vue前端开发自学,祖孙多层级组件嵌套关系数据传输

vue前端开发自学,祖孙多层级组件嵌套关系数据传输&#xff01;官方提供了一个解决方案&#xff0c;就是&#xff0c;在根组件内使用provide,哪个子孙组件想调用这个数据&#xff0c;就可以inject接收就行了。虽然是方便了&#xff0c;但是这个有点要求&#xff0c;就是只能自上…

C 练习实例29

题目&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。 题目分析&#xff1a; 假设一个九位数12346789&#xff0c;我们想得到它是几位数&#xff0c;可以直接循环除以10&#xff0c;除到商为零位置。可…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

oracle重启数据库lsnrctl重启监听

oracle重启数据库lsnrctl重启监听 su到oracle用户下,命令 su - oracle切换需要启动的数据库实例&#xff1a; export ORACLE_SIDorcl进入Sqlplus控制台&#xff0c;命令&#xff1a; sqlplus /nolog以系统管理员登录&#xff0c;命令&#xff1a; connect / as sysdba如果是…

数据操作、数据预处理

1.数据类型&#xff1a; 2.数组元素操作&#xff1a; 3.数据预处理&#xff1a; import os import pandas as pd import numpy as np#创建csv文件并写入数据 os.makedirs(os.path.join(.., data), exist_okTrue) data_file os.path.join(.., data, house_tiny.csv) with open…

华为OD机试真题-堆内存申请-2023年OD统一考试(C卷)

题目描述: 有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为优先紧接着前一块已使用内存分配空间足够且最接近申请大小的空闲内存。 输入描述: 输入: 第1行是1个整数,表示期望申请的内存字节数; 第2到N行是用空格分割的两个整数,表示当前已分配的内存…

如何在电脑上免费更改 PDF 格式文档的字体大小?

对于需要编辑或修改的 PDF 文件来说&#xff0c;更改其字体大小是一个非常常见且必要的工作。虽然 Adobe Acrobat Pro DC 等专业的 PDF 编辑软件可以帮助您完成此任务&#xff0c;但他们通常都需要昂贵的恢复。幸运的是&#xff0c;有许多免费的 PDF 编辑工具可供选择。在本文中…

WSL dockers容器挂载windows下的文件

-v /mnt/c/Users/<Windows用户名>/<测试数据目录>:/app/test-20240104请注意&#xff0c;您需要将<Windows用户名>和<测试数据目录>替换为您在Windows上实际使用的用户名和测试数据目录。例如&#xff0c;如果您的Windows用户名是bear&#xff0c;测试…

【WPF.NET开发】流文档

本文内容 什么是流文档&#xff1f;流文档类型创建流内容与流相关的类内容架构自定义文本 流文档旨在优化查看和可读性。 流文档根据运行时变量&#xff08;例如&#xff0c;窗口大小、设备分辨率和可选的用户首选项&#xff09;来动态调整和重新排列内容&#xff0c;而不是设…