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.
去除数组中与给定值相同的元素,并调整数组,函数返回值为调整后的数组长度。要求不能使用额外的空间开销。
自己的思路:先排序,然后记录符合条件的元素个数,然后从首次出现的位置开始,向后依次替换。9MS AC
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int tot = 0;
int first = 0; //首次出现的位置
sort(nums.begin(),nums.end());
for(int i=0;i<len;i++)
{
if(nums[i] == val)
{
if(tot == 0)
{
first = i;
}
tot++; //先记录相同的个数
}
}
for(int i=first;i<len-tot;i++)
{
nums[i] = nums[i+tot];
}
return len-tot;
}
};
思路二:使用两个指针,用pointer指针记录最终位置。9MS AC。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int pointer = 0;
for(int i=0;i<len;i++)
{
if(nums[i] != val)
{
nums[pointer++] = nums[i];
}
}
return pointer;
}
};
思路三:solution栏提供的思路,声称简单并且优化过了,但其实速度非常慢,12MS几乎垫底。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int cnt = 0;
for(int i = 0 ; i < nums.size() ; ++i) {
if(nums[i] == val)
cnt++;
else
nums[i-cnt] = nums[i];
}
return nums.size()-cnt;
}
};