力扣27.移除元素(双指针)
题目看起来很乱,实际上意思是:把数组中值不等于val的元素放在下标为0,1,2,3......,并且返回数组中值不等于val的元素的个数
方法一:直接判断+覆盖
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int k=0;
for(int x:nums)
{
if(x!=val)
{
nums[k++]=x;
}
}
return k;
}
};
方法二:快慢指针
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int slowindex=0;
for(int fastindex=0;fastindex<nums.size();fastindex++)
{
if(nums[fastindex]!=val)
{
nums[slowindex++]=nums[fastindex];
}
}
return slowindex;
}
};
解释一下:一开始快慢指针都指向第一个元素,接着快指针往后遍历。如果快指针指向的元素的值不等于val,那么先覆盖,然后慢指针也跟着往后遍历,这保证了不等于val的元素都放在了前面。如果值等于val,那么慢指针停下,快指针继续移动,直到遇见了不等于val的元素,再将其进行覆盖。最后快指针指向末尾,快指针与慢指针之间的差值就是等于val的元素的个数,因此慢指针的值就是不等于val的元素个数