给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
1. 双指针法,分别从头尾开始。当头指针所指元素是需要移除的元素,则头指针元素与尾指针元素交换,并且尾指针后退一格。当头指针指向元素不是需要移除的元素,则头指针前进,尾指针不动。
int removeElement(vector<int>& nums, int val) {
int front = 0, back = nums.size()-1;
while(front<=back)
{
int temp;
if(nums[front] == val)
{
temp = nums[front]; //可去
nums[front] = nums[back];
nums[back] = temp; //可去
back--;
}else{
front++;
}
}
return front++;
}
2. 其实不需要交换front和back的元素,直接用back元素覆盖front元素即可。
while(i<n)
{
if(nums[i]==val)
{
nums[i]=nums[n-1];
n--;
}
else i++;
}
3. vector中remove和erase配合删除元素
nums.erase(remove(v.begin(), v.end(), val), v.end());
4. 利用vector中的erase方法
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == val) {
nums.erase(nums.begin() + i);
i--;
}
5. 使用pop_back
for (int i = 0; i < nums.size(); ){
if (nums[i] == val){
nums[i] = nums[nums.size()-1];
nums.pop_back();
}else{
i++;}