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

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题:LeetCode27.移除元素

  • 1.问题描述
  • 2.解题思路
  • 3.代码

1.问题描述

问题描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 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

2.解题思路

知识点:要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

  1. 暴力解题:这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。时间复杂度是O(n^2)。
  2. 双指针法(快慢指针法)通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

    双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。

3.代码

python:暴力法

class Solution:def removeElement(self, nums: List[int], val: int) -> int:i, l = 0, len(nums)while i < l:if nums[i] == val: # 找到等于目标值的节点for j in range(i+1, l): # 移除该元素,并将后面元素向前平移nums[j - 1] = nums[j]l -= 1i -= 1i += 1return l

python:快慢指针法

class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 快慢指针fast = 0  # 快指针slow = 0  # 慢指针while fast < len(nums):  # 不加等于是因为,a = size 时,nums[a] 会越界# slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换if nums[fast] != val:nums[slow] = nums[fast]slow += 1fast += 1return slow

C++:暴力法

class Solution {
public:int removeElement(vector<int>& nums, int val) {int size = nums.size();for (int i = 0; i < size; i++) {if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位for (int j = i + 1; j < size; j++) {nums[j - 1] = nums[j];}i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位size--; // 此时数组的大小-1}}return size;}
};

C++:快慢指针法

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

相关文章:

  • ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现
  • Scalable Exact Inference in Multi-Output Gaussian Processes
  • 设计模式 -- 适配器模式(Adapter Pattern)
  • C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类
  • Flume的安装部署及常见问题解决
  • 2023最新最全【Nacos】零基础安装教程
  • 核—幂零分解
  • [Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例
  • dropout层加在哪里
  • 下海建龙宫
  • 轻量级 Java 日志组件
  • 大模型的语言能力
  • 俄罗斯成为印度的第二大进口国,柯桥外贸俄语培训
  • 提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • 4. 路由到控制器 - Laravel从零开始教程
  • angular2 简述
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • flask接收请求并推入栈
  • learning koa2.x
  • Linux中的硬链接与软链接
  • Mybatis初体验
  • Odoo domain写法及运用
  • 成为一名优秀的Developer的书单
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 前端技术周刊 2019-01-14:客户端存储
  • 十年未变!安全,谁之责?(下)
  • 源码安装memcached和php memcache扩展
  • 2017年360最后一道编程题
  • zabbix3.2监控linux磁盘IO
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • $(function(){})与(function($){....})(jQuery)的区别
  • (39)STM32——FLASH闪存
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)80c52学习之旅-起始篇
  • (一)appium-desktop定位元素原理
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)重识new
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET Core跨平台微服务学习资源
  • .NET Framework .NET Core与 .NET 的区别
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 中创建支持集合初始化器的类型
  • .NET导入Excel数据
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [acm算法学习] 后缀数组SA
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android] Upload package to device fails #2720
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试