移除元素

789 字
4 分钟
移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

  • 难度:简单
  • 标签:数组、双指针

题目描述#

Note

原题说明: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同元素的数量。

判定标准: 系统会检查 nums 的前 k 个元素是否为排除了 val 后的元素,且返回长度 k 是否正确。

示例#

  • 输入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,4,0,3,_,_,_]

方案一:快慢指针法(避坑版)#

核心思路: 使用两个指针:read(快指针)扫描全数组,write(慢指针)记录下一个可写位置。只有当快指针指向的元素不等于 val 时,才将其搬运到慢指针位置。

源码实现#

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int write = 0; // 慢指针:下一个合法元素存放位置
for (int read = 0; read < nums.size(); ++read) {
if (nums[read] != val) {
nums[write++] = nums[read]; // 先赋值,再自增
}
}
return write; // write 此时正好等于新数组长度
}
};

关键细节:为什么是 write++ 而不是 ++write#

在上一道题(第26题:去重)中,我们用了 ++write,但在这一题中必须使用 write++

  • write++ (后置自增):先在当前位置写入,再移动到下一个。这意味着 write 始终代表“当前已处理好的长度”。
  • ++write (前置自增):如果第一个元素就需要保留,++write 会跳过下标 0,导致第一个位置没被正确处理。

方案二:双指针优化(首尾交换)#

核心思路: 如果要移除的元素很少,我们可以将要移除的元素同末尾元素交换。这样可以减少不必要的元素搬运。

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
int right = nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--; // 缩减数组范围
} else {
left++;
}
}
return left;
}
};

复杂度分析#

  • 时间复杂度O(n)O(n)nn 为数组长度,两种双指针法都只需遍历一次。
  • 空间复杂度O(1)O(1)。原地修改。

方案三:一行代码(STL 威力)#

C++ <algorithm> 库中的 std::remove 实际上执行的就是快慢指针逻辑。

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// remove 将不等于 val 的元素移到前面,返回“新结尾”的迭代器
return std::remove(nums.begin(), nums.end(), val) - nums.begin();
}
};

总结#

  • 与 26 题的区别:26 题是有序去重(比较相邻项),27 题是无序移除(比较固定值)。
  • 指针灵活性:掌握 write++ 的时机是处理原地数组修改问题的基本功。
  • 内存回收:在 LeetCode 环境中,原地移除并不意味着真正的 delete 内存,而仅仅是通过移动元素来“覆盖”不需要的值,并返回逻辑上的新长度。
Tip

数组的“原地删除”其实就是“覆盖”。学会用一个慢指针控场,你的数组操作会变得非常优雅!

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

移除元素
https://firefly-7a0.pages.dev/posts/leetcode_notes/27remove-element/
作者
lonelystar
发布于
2025-10-10
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-10-10,距今已过 201 天

部分内容可能已过时

评论区

Profile Image of the Author
LonelyStar
Hello, I'm LonelyStar.
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
119
分类
11
标签
346
总字数
226,548
运行时长
0
最后活动
0 天前

目录