题目描述:给一个数组和一个值,去掉这个数组中所有等于这个值的元素,返回处理后的数组长度。要求原地操作,可更改元素顺序。
分析:双指针的应用,设指针 k 指向目前不等于给定值的最后一个元素的下标,遍历数组的同时判断元素是否为给定值,不是则 A[k++] = A[i],否则不处理。 时间复杂度O(n),空间O(1)。
方法一:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = 0;
for (int i = 0; i < nums.size(); i ++)
if (nums[i] != val)
nums[k ++] = nums[i];
return k;
}
};
方法二:用C++ STL函数一句话即可。remove(nums.begin(), nums.end(), val)); 效果是删除迭代器区间中所有值为val的元素,实际上并未从内存中删除,只是移动了位置,返回进行删除操作后,最后一个元素的位置。要真正删除还需 nums.erase(remove(nums.begin(),
nums.end(),val), nums.end());
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
return distance(nums.begin(), remove(nums.begin(), nums.end(), val));
}
};