LeetCode笔记 NO.27移除元素

LeetCode27移除元素(数组) 算法特点及适用场景该算法巧妙地运用双指针思想实现了原地移除数组中指定元素的功能,无需额外开辟大量空间来存储新数组,空间利用效率较高。适用于各种需要在原数组基础上筛选、移除特定值元素的场景,只要符合能够按照给定值来移除元素并且可以直接对原数组进行修改的需求,都可以运用这种算法思路来解决问题。注意事项及可能遇到的问题在代码实现过程中,要确保指针操作的准确性,特别是在进行元素赋值和指针移动时,容易出现数组越界或者元素覆盖等错误,进而导致结果不正确。 阅读详情

题目描述

 1.撸起袖子就是干!

 1.1代码

    public int myRemoveElement(int[] nums, int val) {
        int k = 0, i= 0, j=0;

        while(j < nums.length){
            if(nums[j] != val){
                //这里临时变量多余了,不用temp,nums[i] = nums[j]即可,i指向的要么是初始位置,这时候i和j相同,没关系。此外i指向的都是等于j的位置或out of index
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                //这里的K多余了,完全可以用i替代
                k++;
                i++;
            }
            j++;
        }
        return k;
    }

1.2报错

没报错,AC了

 2.题解

2.1方法一:双指针

class Solution {
    public int removeElement(int[] nums, int val) {
        int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为序列的长度。我们只需要遍历该序列至多两次。

  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

2.2方法二:优化双指针

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = nums.length;
        while (left < right) {
            if (nums[left] == val) {
                nums[left] = nums[right - 1];
                right--;
            } else {
                left++;
            }
        }
        return left;
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为序列的长度。我们只需要遍历该序列至多一次。

  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

3.二周目挑战BOSS

    public int fixMyRemoveElement(int[] nums, int val) {
        int i= 0, j=0;

        while(j < nums.length){
            if(nums[j] != val){
                nums[i] = nums[j];
                i++;
            }
            j++;
        }
        return i;
    }

当然也是AC了,省了很多不必要的变量

4.程序员の沉淀

方法二避免了需要保留的元素的重复赋值操作

这个优化在序列中 val 元素的数量较少时非常有效。它的优化是减少了赋值的操作(读、写内存),当nums非常大时,运行时间将会看到明显区别

但我觉得这个解释比较扯淡,这么说方法1在val元素数量比较多时也非常有效呢!

LeetCode 27:移除元素 题意 给你一个数组 nums 和一个 val,原地移除所有数值等于 val 的值,并返回移除后数组的新长度。 示例 输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3] 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。 提示 必须使用 O(1) 空间复杂度并原地修改输入数组。 0 <= len(nu.. 阅读详情

相关推荐

LeetCode 27 移除元素

(Remove Element)是一个简单但经典的双指针问题,主要考察数组操作的基本功。虽然问题容易,但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。numsvalvalvalslowfastfastslownums[fast]nums[slow]slowvalvalleftrightrightleftvalval如果输入是链表而不是数组,移除目标值时可以使用“指针删除”,无需双指针。valnextval在数组中移除所有小于指定值val的元素,保留其他元素。

互联网架构师笔记 949

【LeetCode_27】移除元素

LeetCode第27题「移除元素」的C++解法

有梦想的电信狗 1358

基于STM32和K210的自动驾驶小车设计

自动驾驶技术正在迅速发展,成为了汽车行业和智能交通领域的热点之一。随着科技的发展,STM32和K210这两款芯片为自动驾驶小车提供了优秀的硬件支持。本文我们将学习如何使用STM32和K210打造一个简单的自动驾驶小车。提示:以下是本篇文章正文内容,下面案例可供参考通过这篇文章,掌握了如何使用STM32和K210构建一个简单的自动驾驶小车。通过了解基本的电路设计,并编写了STM32和K210的代码。通过这个例子,可以更好地理解如何在嵌入式系统中使用STM32和K210,以及如何实现自动驾驶小车的简单功能。

Kyle_Chan_zMH的博客 2215

力扣LeetCode27:移除元素(python)

力扣27:移除元素,有三种解法和思路总结,还有我亲自画的步骤图!

diemeng9339的博客 1094

QT项目实战:如何在正点原子Linux开发板上集成CVR-100UC身份证阅读器(附完整代码)

本文详细介绍了在正点原子Linux开发板上集成CVR-100UC身份证阅读器的完整实战流程。内容涵盖驱动适配、库文件部署、QT项目框架搭建、核心功能封装以及界面集成,并提供了完整的代码示例,帮助开发者快速实现嵌入式环境下的身份证信息读取功能。

yyy34的博客 257

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

LeetCode 27.移除元素

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

2301_80211119的博客 1387

DRM遇到的实际问题及领悟(3)

DRM遇到的实际问题及领悟(3)

phmatthaus的专栏 635

力扣 27.移除元素

/ 它以不等于 val 的值排序。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。1.双指针法通过快慢指针协同工作,在不使用额外空间的前提下高效解决原地移除元素问题。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你的函数函数应该返回 k = 2, 并且 nums。的值即为剩余有效元素的数量,数组前。

2401_89122881的博客 1652

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3202

海外购物商城源码 带即时通讯IM源码

在海外购物商城中,即时通讯IM源码可以为用户提供更便捷、高效的沟通方式,帮助解决跨国交易中的语言和文化差异问题。总之,即时通讯IM源码在海外购物商城中扮演着重要的角色,可以为用户提供更方便、高效的沟通方式,解决跨国交易中的语言和文化差异问题。(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买)实时翻译:即时通讯IM源码提供实时翻译功能,能够快速准确地翻译不同语言之间的文字、语音、视频等信息,帮助用户克服语言障碍。

很酷的站长的博客 259

[力扣LeetCode]27-移除元素

[力扣LeetCode]27-移除元素

JoeyTanHDU的博客 556

PyTorch深度学习实战(6)——神经网络性能优化技术

神经网络性能优化技术是指通过改进神经网络的结构、参数初始化、正则化和训练过程等方面来提高其性能和泛化能力的方法。优化技术的选择和调试需要根据具体问题进行,通过不断实验和调整,找到最适合网络的优化策略。本节首先训练了一个简单的全连接网络,然后在此基础上介绍了简单有效的神经网络性能提升技巧。

盼小辉丶的博客 1万+

LeetCode27. 移除元素

设置快慢指针,fastPoint和slowPointfastPoint:寻找新数组需要的值slowPoint:新数组需要更新的位置下标。

m0_54096850的博客 1640

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【LeetCode力扣题库】27. 移除元素(简单)

原题目链接:27. 移除元素 题目描述: 给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // num...

一个平平无奇的攻城狮 4487

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Leetcode 27. 移除元素

经典的双指针技术,这里称为快慢指针。其中,(快指针)遍历数组,(慢指针)跟踪新数组的填充位置。这种方法有效地在原数组上进行操作,避免了使用额外空间。初始化: 指针初始化为 ,用于指示新数组的当前填充位置。遍历数组:返回结果:循环结束后, 指针的位置表示了新数组的长度,因此直接返回 。假设 ,:时间复杂度:O(n),其中 n 是数组 的长度。这是因为我们需要遍历整个数组一次,来检查每个元素是否需要被移除。空间复杂度:O(1),我们没有使用额外的数组或数据结构,所有操作都在原数组上完成。 拓展 主要类型的双指

2401_82394804的博客 1490

27.移除元素(力扣LeetCode)

例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。输入:nums = [0,1,2,2,3,0,4,2], val = 2。元素的顺序可以改变。输入:nums = [3,2,2,3], val = 3。输出:5, nums = [0,1,3,0,4]

m0_73841621的博客 1035

【数组】力扣27题:移除元素

建议在看题目之前先了解数组的具体知识点,可以看这里: [算法基础(二):数组知识点及题型讲解]

niexinyu0026的博客 892

【leetcode】27.移除元素

2.如果在遍历nums数组时想在一次遍历内完成对所有元素的判断以及nums数组修改的话,需要在判定当前元素等于val时移除当前元素时快指针值不变,这样快指针值指向的还是原来的位置但在下次遍历时存放的是下一元素了,若当前元素不等于val则快指针值才变化。目的:对输入的数组进行修改,需要删去其中所有与输入变量相等的元素,最后返回修改后的数组和剩余的元素数量。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

weixin_63878791的博客 1024

力扣27题 移除元素 python的三种解法

力扣27题 移除元素暴力解法双指针三行解法   给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。   不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。   元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑

银域果酒的博客 1369

leetcode_27. 移除元素_java

​ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。 返回 k。

weixin_46211609的博客 952

LeetCode - 27 移除元素

我们假设 [0, i] 范围内不含值为 val 的元素,然后用 j 遍历 nums 数组的每个元素 nums[j]// 它以不等于 val 的值排序。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你的函数函数应该返回 k = 2, 并且 nums。

优快云 1210

LeetCode27_移除元素

快慢指针 & 对撞指针 的应用

Haolin_Liu的博客 714

力扣27 移除元素

link给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。

2301_79524309的博客 598

【力扣刷题】27. 移除元素(题解笔记)

在力扣上刷的第一道题 记录下大佬的题解

HeyRena的博客 368
上一篇: LeetCode笔记 NO.704二分查找
下一篇: 为什么要实现 Serializable?——深入理解 Java 序列化机制
Zyang_CodeBoy
博客等级 码龄1年 15粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值