给定一个数组,在数组中删除等于这个目标值的元素,然后返回新数组的大小
数组理论:
数组是一个连续的类型相近的元素的一个集合,数组上的删除是覆盖,只能由后面的元素进行覆盖,而不能进行真正意义上的地理位置删除。
erase()函数:用来删除数组中的某某元素,是一个O(n)的操作。当在一个数组中删除一个元素时,需要将该元素后面的元素整体向前移动,实现一个覆盖的操作。
暴力解题思路:
先用for循环遍历数组找到要删除的目标元素
再使用for循环把目标元素后面的元素一个一个向前覆盖,以实现元素的删除
双指针思路:
使用一个for循环完成暴力解法两个for循环的工作。
定义两个指针,一个快指针(寻找新数组里所需的元素(新数组:删除目标元素之后的数 组)),一个慢指针(新数组的下标值),当快指针指向的元素不等于目标元素时,将快指针获取到的值赋给慢指针。此时慢指针向后移动一位进行更新。当快指针指向的元素等于目标元素时,慢指针不更新,跳过目标元素,实现目标元素的删除。
例:
解题一:暴力穷举法
cpp
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0;i <size;i++)
{
if(nums[i] == val)
{
for(int j = i + 1; j < nums.size(); j++)
nums[j - 1] = nums[j];
i--;
size--;
}
}
return size;
}
};
解法二:双指针
cpp
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int slow = 0;
for(int fast = 0; fast < size; fast++)
{
if(nums[fast] != val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};