返回
剑指 LeetCode 27:原地移除数组中的指定元素
前端
2023-10-30 17:00:45
题目
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间 ,你必须 仅使用 O(1) 额外空间 并 原地 修改输入数组。
示例
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2
解释:nums 中的所有值为 3 的元素都已经被删除,现在数组包含 [2,2]。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5
解释:nums 中的所有值为 2 的元素都已经被删除,现在数组包含 [0,1,3,0,4]。
约束:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
解题思路
本题的核心思想是使用双指针,slow
指针指向已经移除所有 val
值的数组的末尾,fast
指针遍历整个数组,当遇到不等于 val
的值时,则将 fast
指针指向的值赋给 slow
指针指向的值,并将 slow
指针后移一位。
C++ 代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};
复杂度分析
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。 - 空间复杂度:O(1),因为我们没有使用额外的数组空间。
拓展
LeetCode 中还有一道类似的题目,名为「剑指 Offer 21. 调整数组顺序使奇数位于偶数前面」,这道题目的要求是将数组中的所有奇数都放在数组的前半部分,所有偶数都放在数组的后半部分。我们可以使用类似的双指针方法来解决这道题目。
总结
本题是一道经典的数组操作题目,考察了我们对双指针方法的掌握程度。我们通过使用双指针,可以有效地原地移除数组中的指定元素,而不需要使用额外的数组空间。这道题目的解法也为我们解决其他类似的题目提供了一定的思路。