法一:双指针法(快慢指针):从头出发,在原位刷新一个新数组,慢指针代表新的数组的尾部,快指针遍历原数组。对不等于val的值,从原数组中添加到新数组的尾部。第二次没做出来
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int len = nums.size();
int j = 0;
for(int i = 0;i<len;i++)
{
if(nums[i] != val)
{
nums[j] = nums[i];
j++;
}
}
return j;
}
};
**法二:双指针优化(左右指针):**从两边出发,左指针指新数组尾部,右指针选择不等于val的元素覆盖左指针指向的等于val的元素,当两指针重合时,遍历完原数组。(左)右指针指向的元素使用完后立即(右)左移右指针
第三遍总结:right必须从nums.size()开始,且左值针指向的元素是需要进行判断的,也就是左值针左边就是要被输出的元素。如果 right 从 nums.size()-1 开始,则当左右指针同时指向一个数时,该元素会被漏掉。我们的目的就是遍历所有的元素
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int left = 0, right = nums.size();
while (left < right)
{
if (nums[left] == val)
{
nums[left] = nums[right - 1];
right--;
}
else
{
left++;
}
}
return left;
}
};