LeetCode - 移除元素

2023-11-03

一. 题目描述

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

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

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

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

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

二. 我的解法

2.1 代码

  今天这个题目我也看了不少其他人的代码,出于对性能和可读性上来考虑的话,还是我的代码要更好一些,不过也是因为在LeetCode也只能看到部分代码的关系,并不能看到更多的其他的人的代码了,所以我厚颜无耻且自信地认为这是我目前看到的最好的解决方案。

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

2.2 分析

1.在讲这个代码之前, 我觉得有必要先看另外一道题的解法,看不懂以上代码的同学可以先看第三节中介绍的另一个题目。

2.看了第三节的同学再来看这段代码,应该就会觉得很好理解了,没错,都是一样的套路,就是不仅将原数组的数组都拿出来用,同时也认为原数组中每个位置都是空的。

3. 为什么可以这么认为呢?首先,从预期的结果,也就是我们整个程序执行完成之后nums的结果,如题目描述中示例1中,运行后,nums=[2, 2, 2, 3],有些同学可能会问,结果中还是存在3,这里,我需要说:请注意审题!!“你不需要考虑数组中超出新长度后面的元素。”也就是说, 外部的程序会自动按照他预期的结果长度来截取你返回的数组,所以,只要把需要的提前或者是不要的后置就可以了,我们采用的就是需要的提前的法子。

4. 既然已经知道了运行结果了, 那么再来讲解一下, 博主是怎么想到用这个方法的,很显然, 我是做了下面第三节描述的那道题之后才做的这道题,所以, 很容易就想到了这个方法,哈哈哈。

5. 不皮了,讲一下这么遍历操作的合理性,很显然,前面我们已经说过了,我们是采用将需要的数据提前的方法,那么正常的思路当然是,正向去遍历,然后找到一个需要的就往前面放,并放在上一个放置好的元素后一位,那么这么去操作的话,结果数组中的所有元素的原位置肯定不会比当前位置要大,也就是说, 在原数组中的元素要么已经在它未来的位置,要么就是在未来位置的后面,已经在未来位置上了的,表明在遍历过程中不会被移动,而不在位置上的将会被提前,而提前的元素并不会影响后面需要的元素,由于是正向遍历,也表明当前元素之前的元素已经提前完毕,所以,博主判断第三节的方法用在这道题是可行的,然后一试,果然通过了。

三. 删除排序数组中的重复项

3.1 问题描述

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

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

3.2 代码

class Solution {
    public int removeDuplicates(int[] nums) {
        int pre = 0;
        
        for(int i = 1; i < nums.length; i++)
        {
            if( nums[i] != nums[pre] )
            {
                pre += 1;
                nums[pre] = nums[i];
            }
        }
        
        return pre + 1;
    }
}

3.3 分析

1.  是不是觉得这个代码跟上一题的代码非常像,不过这道题想到这么写就要简单得多了。

2. 思路很简单,既然数组已经是排序好了的,那么我只需要记住第一次出现这个数字的位置,如果这个数字继续出现,就继续遍历,如果出现新的数字,就让当前索引位置加 1 , 并将这个新出现的数字放置在当前位置上;接着重复以上的操作即可。

3.  跳过来看的同学可以跳回第二节了。

四. 参考

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/

https://leetcode-cn.com/problems/remove-element/description/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode - 移除元素 的相关文章

  • linux挂载新磁盘、分区和开机自动挂载

    查看分区 php view plain copy fdisk l 其中第一个框和第二个框 是已经分好区的磁盘 第三个硬盘没有分区 开始分区 html view plain copy fdisk dev sdc 输入m 可以查看有哪些操作 输
  • 2021-03-30 重定向

    重定向和转发的区别 相同点 页面都会实现跳转 不同点 请求转发的时候 url不会发生变化 重定向时候 url地址会发生变化
  • linux命令

    功能 linux命令 备注 创建目录 mkdir p dirname p 确保目录名称存在 不存在的就建一个 创建文件 touch 显示文件路径 pwd 绝对路径 查找指定文件 find name 20230516 txt 可改为其他指定路
  • JAVA高并发---收藏的好文章(持续更新)

    JAVA高并发 AQS详解 转载 学习前因 本来对多线程略懂 最近忽然看到了CountDownLatch 的用法 忽然想简单看看它的原理 了解一下它阻塞线程的方法 我只知道阻塞线程的lock 和wait notifyAll 才发现原来还有L

随机推荐

  • 冒泡排序(一)

    package com test basic array 功能 冒泡排序 从小到大排 思路 相邻两个数比较 左边比右边大则交换 整体比较完毕是一次排序 这样的排序要进行n 1趟 public class BubbleSort public
  • 拉普拉斯平滑

    之前的博客介绍过自己对于正则化的理解 经过这段时间的进一步接触 尤其是看了一些关于这一方面的paper 做了一些简短的实验 发现正则化真是一个很给力的建模方法 近期 看到了Laplacian Smoothing 相信很多童鞋遇到过这两个单词
  • 微信小程序完整项目实战(前端+后端)

    基于微信小程序的在线商城点单系统 前言 闲来无事 想以后自己开一个小超市或者小吃店 能够支持线上下单 既方便客户也方便自己 系统采用C 语言作为后端实现与小程序的交互 给用来学习或者想自己开个小店的朋友当个参考 文末获取源码联系 精彩专栏持
  • 2021-5-08 力扣每日一题

    1723完成所有工作的最短时间 虽迟但到 带你一文读懂状态压缩在动态规划中的应用 题目表述 给你一个整数数组 jobs 其中 jobs i 是完成第 i 项工作要花费的时间 请你将这些工作分配给 k 位工人 所有工作都应该分配给工人 且每项
  • cookie与session区别以及机制原理 http以及https

    cookie与sseion区别 1 cookie保存在客户端 session保存在服务端 2 cookie只能保管ascii字符串 session能存取任意类型数据 如 String Integer List Map等 也能保管Java B
  • How To Lock/Unlock User Accounts From The Terminal Under Ubuntu/Linux Mint

    In a previous article we have seen how to add remove user accounts from the terminal under Ubuntu Linux Mint Today we wi
  • uni-app如何导入秋云 ucharts echarts 高性能跨全端图表组件

    感性认识 想在 uni app 中使用 ucharts 官方提供了两种方法 uni modules版本 非 uni modules版本 何为 uni modules 请看官方文档 uni modules插件规范 uni app官网 dclo
  • mysql generator 配置_MyBatis Generator 超详细配置

    想快速开始 请直接拉到最后 看整体配置 MyBatis Generator 是 MyBatis 提供的一个代码生成工具 可以帮我们生成 表对应的持久化对象 po 操作数据库的接口 dao CRUD sql的xml mapper MyBati
  • LocalDate、LocalTime、LocalDateTime介绍

    一 Date与LocalDate LocalTime LocalDateTime互转 1 Date转LocalDate LocalTime LocalDateTime Date date new Date Instant instant d
  • 基于粒子群优化改进的SIFT算法实现SAR图像配准附MATLAB代码

    基于粒子群优化改进的SIFT算法实现SAR图像配准附MATLAB代码 图像配准是合成孔径雷达 SAR 图像处理中的重要任务之一 它的目标是对两幅或多幅图像进行对齐 使得它们在几何上或像素级别上达到最佳匹配 在这篇文章中 我们将介绍基于粒子群
  • 元素层叠总结

    重点 在相同的层叠环境及优先级下 inline inline block元素的层叠顺序高于block元素 详解链接 https www codercto com a 23706 html 本文转载自 https juejin im post
  • SQL根据不同状态类型动态使用不同排序方式

    SQL根据不同状态类型使用不同排序方式 1 业务场景 1 1 需求 默认按状态值为1 2 3 5 4的顺序排序 状态相同时 状态为1 则按创建时间倒序 状态为2 则按开始时间正序 1 2 示例SQL select from t table
  • 【FPGA面试题(八)】—— 实现简单的FIFO

    FPGA面试题 八 实现简单的FIFO 在FPGA的数字电路中 FIFO First In First Out 是一个非常基础且重要的模块 它可以像一个队列一样存储数据并按照先进先出的顺序进行读取 实现FIFO是FPGA工程师面试过程中经常
  • notepad: 怎么在notepad里面,将字符串替换成换行

    用Notepad 可以 利用查找和替换功能 选择正则表达式 查找目标框里输入你想要替换的字符串 替换为框里输入 r 点击替换即可 这是个 很强大的功能 利用还它可以批量替换任何字符串 比如你链接是123 123 123 123这样不换行的
  • python 实现 熵值法 确定指标权重

    步骤 设指标共p个 评价对象共g个 则构成评价值 得分 矩阵如下 xj i 表示评价对象j在指标i上的评价值 j 1 2 g i 1 2 p 指标i对应的熵值为ei的计算公式如下 根据熵值来计算指标i的权重wi 计算公式如下 程序 4个指标
  • pm2 进程管理工具,相关命令

    1 pm2需要全局安装 npm install g pm2 2 进入项目根目录 2 1 启动进程 应用 pm2 start bin www 或 pm2 start app js 2 2 重命名进程 应用 pm2 start app js n
  • minicom安装、配置和使用

    在开发过程中 我们经常需要通过串口连接Android开发板的底层系统 Linux QNX 等 minicom是一个常用串口连接终端软件 在命令行终端下通过文本界面进行操作使用 安装 sudo apt install minicom 配置 首
  • BufferedReader与FileReader及FileInputStream

    BufferedReader 是缓冲字符输入流 它继承于Reader BufferedReader 的作用是为其他字符输入流添加一些缓冲功能 BufferedReader的作用 从字符输入流中读取文本 缓冲各个字符 从而实现字符 数组和行的
  • C# Ocr离线式识别,文字提取,(附源码下载)

    源代码下载 效果图 文字内容提取后填充 JObject obj ocr GeneralBasic bt ops this richTextBox1 Text string str if obj Count gt 0 JArray jo JA
  • LeetCode - 移除元素

    一 题目描述 给定一个数组 nums 和一个值 val 你需要原地移除所有数值等于 val 的元素 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 元素的顺序可以改变 你不需要