代码随想录—力扣算法题:27移除元素.Java版(示例代码与导图详解)

news2024/11/18 5:27:57

版本说明

当前版本号[20230804]。

版本修改说明
20230804初版

目录

文章目录

  • 版本说明
  • 目录
  • 27. 移除元素
    • 思路
    • 暴力解法
    • 双指针法
    • 两个方法的区别
    • 总结
      • 双指针法要点

27. 移除元素

力扣题目链接
更多内容可点击此处跳转到代码随想录,看原版文件

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

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

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

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

思路

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

暴力解法

这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组

删除过程如下:当nums=[1,2,3,4,1,2],删除元素3

第一步:从下标为0开始向右查找,直到找到元素为3的下标

image-20230804174939238

image-20230804175102800

第二步:当找到元素为3的下标,将其删除

image-20230804175158854

第三步:删除完后,后面数组的元素就会往前靠了,最后一个元素除了向前靠,也会待在原位一个

image-20230804175409373

很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。

对应的java代码如下:

class Solution {
    public int removeElement(int[] nums, int val) {
        int size = nums.length;
        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;
    }
}
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

很多同学这道题目做的很懵,就是不理解 快慢指针 究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。

删除过程如下:当nums=[1,2,3,4,1,2],删除元素3

第一步:从下标为0开始向右查找,直到找到元素为3的下标

image-20230804175801182

image-20230804175905225

第二步:两个指针共同找到元素为3的下标后,快指针会先向右移动,将元素为3的值删除,同时把后面的元素往前移

image-20230804180247235

image-20230804180402232

第三步:继续往下走,走至最后,最后一位依旧保留原来的数字

image-20230804180514928

image-20230804180541844

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

后续都会一一介绍到,本题Java代码如下:

public static int removeElement(int[] nums, int val) {
        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }

注意这些实现方法并没有改变元素的相对位置!

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

两个方法的区别

暴力解法和双指针解法的主要区别在于时间复杂度和实现思路上。

暴力解法的思路是遍历整个数组,当发现需要移除的元素时,将数组中的所有元素向前移动一位,以覆盖需要移除的元素。这种解法的时间复杂度是O(n^2),其中n是数组的长度。因为每次移动元素都需要遍历数组的剩余部分,最坏情况下需要移动n次。

双指针解法的思路是使用两个指针,一个指针用于遍历数组,另一个指针用于指示下一个非目标元素要存储的位置。双指针解法的时间复杂度是O(n),其中n是数组的长度。因为遍历数组只需要进行一次,每个元素最多被访问两次。

综上所述,双指针解法比暴力解法具有更优的时间复杂度,并且不需要频繁移动数组中的元素,因此是更高效的解法。

总结

双指针法要点

定义两个指针:快指针和慢指针。

快指针用于遍历数组,慢指针用于指示当前非目标元素的位置。

具体步骤如下:

  1. 初始化快指针和慢指针,都指向数组的起始位置。
  2. 遍历数组,当快指针指向的元素等于目标值时,快指针向后移动一位;否则,将快指针指向的元素复制到慢指针的位置,并同时将快指针和慢指针都向后移动一位。
  3. 重复步骤2,直到快指针遍历完整个数组。
  4. 返回慢指针的位置作为新数组的长度。

测试代码如下:

package shuzhu;

public class Day02 {
    public static int removeElement(int[] nums, int val) {
        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }

    public static void main(String[] args) {
        int[] nums = {1,2,3,4,3,6};
        int val = 3;
        int result = removeElement(nums,val);
        System.out.println("当移除指定元素后,返回新的数组长度为:"+result);
    }
}
void main(String[] args) {
        int[] nums = {1,2,3,4,3,6};
        int val = 3;
        int result = removeElement(nums,val);
        System.out.println("当移除指定元素后,返回新的数组长度为:"+result);
    }
}

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

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

相关文章

VBA技术资料MF39:VBA_计算单元格中的字符数

【分享成果&#xff0c;随喜正能量】依赖也好&#xff0c;不依赖也罢&#xff0c;人的心灵都是需要安放的&#xff0c;有人安放在另一个人身上&#xff0c;有人安放在喜欢的事业之上&#xff0c;有人安放在宗教信仰之上&#xff0c;过程不同&#xff0c;终点都一样&#xff0c;…

C/C++实现librosa音频处理库melspectrogram和mfcc

C/C实现librosa音频处理库melspectrogram和mfcc 目录 C/C实现librosa音频处理库melspectrogram和mfcc 1.项目结构 2.依赖环境 3.C librosa音频处理库实现 (1) 对齐读取音频文件 (2) 对齐melspectrogram (3) 对齐MFCC 4.Demo运行 5.librosa库C源码下载 深度学习语音处…

人工智能学习1——特征提取和距离

强人工智能和弱人工智能&#xff1a; 强人工智能&#xff1a;和人脑一样 弱人工智能&#xff1a;不一定和人脑思考方式一样&#xff0c;但是可以达到相同的效果&#xff0c;弱人工智能并不弱 —————————————————————————————————— 机器学习能…

嘉楠勘智k230开发板上手记录(二)

上次成功在k230上烧录sdk&#xff0c;这次准备实现hello world和ssh scp远程k230 一、PC连接k230 1. 初步准备 首先下载串口工具PuTTY&#xff0c;这个我个人感觉比较方便。 准备两根USB type-C数据线&#xff0c;一根连电源&#xff0c;一根连串口调试。还有Type C公头转网…

【C#学习笔记】内存管理

文章目录 分配内存释放内存GC标记清除算法分代算法 .NET的GC机制有这样两个问题&#xff1a; 官方文档 自动内存管理 自动内存管理是CLR在托管执行过程中提供的服务之一。 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。 对开发人员而言&#xff0c;这就意味着…

Ubuntu 虚拟机和主机无法互相复制文字和文件

1.在虚拟机列表中&#xff0c;右键查看是否有安装VMware Tools&#xff0c;如果没有安装点击安装&#xff0c;如果已经安装了&#xff0c;上面显示重现安装VMware Tools&#xff0c;并且为灰色&#xff0c;如图&#xff1a; 2.如果没有安装点击安装&#xff0c;如果已经安装&am…

【数据结构】堆的原理实现

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ 数据结构与算法       &#x1f6f0;️社区 :✈️ 进步学堂       &am…

C语言的浮点类型:float,double,long double

文章目录 浮点型概述浮点型常量浮点型常量的后缀 溢出上溢 overflow下溢 underflow 一个特殊的浮点值&#xff1a;NaN初始化 浮点型概述 float 称为单精度浮点型。 double 称为双精度浮点型。 long double 称为长双精度浮点型。 C 标准规定&#xff0c;float 必须至少精确到…

MySQL存储过程(二十四)

你相信吗&#xff0c; 相信那一天的夕阳吗? 上一章简单介绍了 MySQL的索引(二十三),如果没有看过,请观看上一章 一. 存储过程 MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起&#xff0c; 应用程序无须关注存储过程和函数内部复杂的S…

【DBeaver】CLIENT_PLUGIN_AUTH is required

1、右键打开编辑连接弹窗&#xff0c;进入编辑驱动设置 2、选择“库” 3、全部删掉&#xff0c;然后点击“重置为默认状态” 4、选中然后点击“下载更新” 5、点击版本号&#xff0c;选择与mysql相同的版本 6、最后一步

使用可视化docker浏览器,轻松实现分布式web自动化

01、前言 顺着docker的发展&#xff0c;很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试&#xff0c;这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以实现可视化&#xff0c;同时可以对浏览器进行相关的操作。 02、开篇 首先…

leetcode 33.搜索旋转排序数组

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;搜索旋转排序数组 ps&#xff1a; 本题是二分查找的变形&#xff0c;旋转排序数组之后其实会形成两个有序的区间。算出平均下标先判断是否与 target 相等&#xff0c;因为这样可以减少代码的冗余。如果前者不成立则使用平…

组合总和 II——力扣40

文章目录 题目描述法一 回溯 题目描述 法一 回溯 class Solution{ public:vector<pair<int, int>>freq;vector<vector<int>> res;vector<int> seq;void dfs(int pos, int rest){//如果目标值为0&#xff0c;说明可能有一个组合或者rest本身为0 …

(7.28-8.3)【大数据新闻速递】《数字孪生工业软件白皮书》、《中国绿色算力发展研究报告》发布;华为ChatGPT要来了

【数字孪生工业软件白皮书&#xff08;2023&#xff09;】 近日&#xff0c;第七届数字孪生与智能制造服务学术会议成功举行&#xff0c;2023《数字孪生工业软件白皮书》在会上正式发布。《白皮书》在《Digital Twin》国际期刊专家顾问委员会指导下&#xff0c;由国家重点研发计…

万字长文之 Serverless 实战详细指南

目录 前言 简易博客系统功能概要 云函数的初始化与基础配置 Tencent Serverless Toolkit for VS Code 数据库选择和设计 数据库选择 数据库设计 云函数自定义域名与 API 网关映射 域名解析 API 网关映射 云函数中的路由设计 云函数中的代码组织 Controller Servi…

搭建Django+pyhon+vue自动化测试平台

Django安装 使用管理员身份运行pycharm使用local 1 pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 检查django是否安装成功 1 python -m django --version 创建项目 1 1 django-admin startproject test cd 切换至创建的项目中启动django项目…

欧拉函数与筛法求欧拉函数

目录 欧拉函数欧拉函数的定义欧拉函数的公式欧拉函数的公式推导欧拉定理典型例题代码实现 筛法求欧拉函数思路分析经典例题代码实现 欧拉函数 欧拉函数的定义 对于任意正整数 n n n,欧拉函数 φ ( n ) φ(n) φ(n) 表示小于或等于 n n n 的正整数中&#xff0c;与 n n n …

企业网盘解析:高效的企业文件共享工具

伴随着信息技术的发展&#xff0c;越来越多的企业选择了基于云存储的企业网盘来进行企业数据存储。那么企业网盘是什么意思呢&#xff1f; 企业网盘是什么意思&#xff1f; 企业网盘&#xff0c;又称企业云盘&#xff0c;顾名思义是为企业提供的网盘服务。除了服务对象不同外&…

【maven】构建项目前clean和不clean的区别

其实很简单&#xff0c;但是百度搜了一下&#xff0c;还是没人能简单说明白。 搬用之前做C项目时总结结论&#xff1a; 所以自己在IDE里一遍遍测试程序能否跑通的时候&#xff0c;不需要clean&#xff0c;因为反正还要改嘛。 但是这个项目测试好了&#xff0c;你要打成jar包给…

全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级

8月4日新闻&#xff0c;今天下午&#xff0c;华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4&#xff01; 在华为发布会上&#xff0c;鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…