Leecode 0027. Remove Element
27. Remove Element
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
用户评测:
评测机将使用以下代码测试您的解决方案:
1 | int[] nums = [...]; // 输入数组 |
如果所有的断言都通过,你的解决方案将会 通过。
1.vector解题思路
这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,最终判断题目的时候会读取数组剩余个数的元素进行输出。
1 | class Solution { |
核心函数解析
- std::remove
- 功能:将所有不等于
val
的元素 "移动" 到向量的前端 - 原理:通过覆盖的方式,将后续元素前移填补等于
val
的元素位置 - 返回值:指向新的逻辑结尾的迭代器(即最后一个保留元素的下一个位置)
- 注意:不会改变向量的实际大小,也不会真正删除元素,只是重新排列了元素
- 功能:将所有不等于
- vector::erase
- 功能:删除向量中从
it
到end()
的所有元素 - 作用:配合
std::remove
,将逻辑上需要移除的元素进行物理删除 - 结果:向量的大小会减小,等于移除的元素数量
- 功能:删除向量中从
算法流程
以nums = [3,2,2,3], val = 3
为例:
std::remove
操作后:- 向量变为
[2,2,3,3]
(元素被重新排列) - 返回的迭代器
it
指向索引 2 的位置(即第一个 3 的位置)
- 向量变为
erase(it, nums.end())
操作后:- 删除从索引 2 到结尾的元素
- 向量变为
[2,2]
,大小为 2
- 返回新的大小 2
2.双指针解法解析
这种方法通过两个指针在同一数组上进行操作,实现了原地移除元素的功能,不需要额外的存储空间。
核心思路
定义两个指针:
slow
(慢指针):表示已经处理好的数组的尾部,即下一个需要填充的位置fast
(快指针):用于遍历整个数组,寻找需要保留的元素算法流程:
快指针依次遍历数组中的每个元素
当快指针遇到的值不等于目标值val
时:
将该值复制到慢指针指向的位置
慢指针向前移动一步
当快指针遇到的值等于目标值val
时:
- 不做任何操作,直接移动快指针
- 遍历结束后,慢指针的位置就是新数组的长度
1 | class Solution { |
3.使用迭代器
1 | #include <vector> |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.