Problem: 27. 移除元素
题目描述
给你⼀个数组 nums 和⼀个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新⻓度。
不要使⽤额外的数组空间,你必须仅使⽤ O(1) 额外空间并原地修改输⼊数组。
元素的顺序可以改变。你不需要考虑数组中超出新⻓度后⾯的元素。
示例 1:
给定 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, 3, 0, 4。
你不需要考虑数组中超出新⻓度后⾯的元素
思路
双指针法(快慢指针法): 通过⼀个快指针和慢指针在⼀个for循环下完成两个for循环的⼯作。
定义快慢指针
快指针:寻找新数组的元素 ,新数组就是不含有⽬标元素的数组
慢指针:指向更新 新数组下标的位置
解题方法
双指针法(快慢指针法)在数组和链表的操作中是⾮常常⻅的,很多考察数组、链表、字符串等操作的⾯试题,都使⽤双指针法。
复杂度
时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
空间复杂度:
添加空间复杂度, 示例: O ( 1 ) O(1) O(1)
Code
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int FastIndex=0, SlowIndex=0;
while (FastIndex<nums.size())
{
if (nums[FastIndex] != val) {
nums[SlowIndex++] = nums[FastIndex];
}
FastIndex++;
}
return SlowIndex;
}
};