移除元素
789 字
4 分钟
移除元素
- 难度:简单
- 标签:数组、双指针
题目描述
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; }};复杂度分析
- 时间复杂度:。 为数组长度,两种双指针法都只需遍历一次。
- 空间复杂度:。原地修改。
方案三:一行代码(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
数组的“原地删除”其实就是“覆盖”。学会用一个慢指针控场,你的数组操作会变得非常优雅!
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-10-10,距今已过 201 天
部分内容可能已过时
相关文章 智能推荐
1
合并两个有序数组
算法 力扣第88题:合并两个有序数组。从正向合并的繁琐到逆向双指针的极简之美,实现 $O(m+n)$ 的高效原地合并。
2
删除有序数组中的重复项
算法 力扣第26题:原地删除有序数组中的重复项。从基础的标记替换,到快慢指针(Two Pointers)的高效演进。
3
加一
算法 力扣第66题:加一。处理大整数数组的进位逻辑,从逐位检查到首位插入的技巧分析。
4
搜索插入位置
算法 力扣第35题:搜索插入位置。深入理解二分查找(Binary Search)的边界处理,实现 $O(\log n)$ 的极速搜索。
5
两数之和
算法 力扣第1题:两数之和的暴力解法与哈希表优化解法分析。
随机文章 随机推荐