题目内容:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路分析
①看完了题目,我们首先来理解一下题目的含义。
这个题目其实就算是说,有一个数组,而且还是一个整型数组,数组里面有一堆数字。然后给你一个特定的数字,这个数字有可能在数组里面找不到,也有可能找得到,如果能找到,就需要将数组里面中和这个数字相同的元素全部删除掉,最后得到一个新的数组。
题目里面说了“原地”,可能我们暂时并不理解“原地”是什么意思,我们可以先不管。为了解决上面说的“删除数组所有特定值”的这个问题,可以采取哪些方法呢?(先思考一下再进行往下看哦!)
是的,我们可以先创建一个临时数组,大小可以和原数组大小一样,然后将原数组中不为特定值的元素(也就是 值 ≠ val)挪到临时数组中,跳过是特定值的元素(值 = val),最后将临时数组中的元素拷贝回原数组,即可解决这个问题。图解如下:
这种方法相信大部分同学都可以想到,但是这个方法有一个很明显的缺陷—当原数组很大的时候,比如说原数组有10万个数据,那么就需要开辟一个可以存10万个数据的临时数组。并且这个临时数组的大小还需要根据原数组的大小不停的变动,在实际中,这种方法很不实用(呆呆的,就是有点呆)。
那么能不能不需要创建临时数组就解决这个问题呢?
(额,既然我都问了,那肯定是有的)
方法一:元素覆盖法(有坑!)
我们可以借鉴顺序表的头删(或者中间任意位置删除)的操作—用后面的元素覆盖前面的元素实现数据的删除。
相关文章:
【数据结构学习笔记】二、线性表—顺序表篇(1)(画图详解+代码实现)