题目要求:
Given an array and a value, remove all instances of that value in place and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example:
Given input array nums = [3,2,2,3]
, val = 3
Your function should return length = 2, with the first two elements of nums being 2.
--------------------------------------------------------------------------------------------------------------------------------------------------------------解法一:
利用迭代器iterator,遍历数组,找到=val的元素,就删除
代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
vector<int>::iterator i;
if(nums.size() == 0)
return 0;
while((i = find(nums.begin(), nums.end(), val)) != nums.end())
nums.erase(i);
return nums.size();
}
};
解法二:
参考了网上的解法,利用两个指针分别指向数组的开头和末尾,如果末尾元素!=val,开头元素==val,则用末尾元素替换掉开头元素,然后末尾元素指针--,开头元素指针++;如果末尾元素==val,则将末尾元素指针--;如果都!=val,则将开头元素指针++;最后返回数组元素个数即可
代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
if(size == 0)
return 0;
int low = 0;
int high = size - 1;
int count = 0;
while(low <= high)
{
if(nums[high] == val)
{
high--;
count++;
continue;
}
if(nums[low] == val)
{
count++;
nums[low] = nums[high];
low++;
high--;
}
else
{
low++;
}
}
return size-count;
}
};