双指针法-------- Leetcode移除元素
问题:
给一个数组 nums 和一个值 val,我们需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
要求:
不使用额外的数组空间(空间复杂度为1),原地修改输入数组。元素的顺序可以改变。不需要考虑数组中超出新长度后面的元素。
首先我们要知道数组删除元素时,只能覆盖不能直接删除。所以整体思路是用要留下来的值覆盖等于val的值。
起初,fast和slow都等于0,都指向2,也有arr[fast]==val; 于是solw不动,暂时记录下来数组中val的值,为后来覆盖做打算,继续循环fast++;如下图所示:
接下来,arr[fast]!=val;将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;继续循环fast++;
arr[fast]==val;solw不动,暂时记录下来数组中val的值,为后来覆盖做打算,继续循环fast++;如下图所示:
接下来,arr[fast]!=val;将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;继续循环fast++;
arr[fast]!=val,将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;
不难看出删除后的数组长度于slow指针的位置数字一样。
总结:slow指针是用来暂时指向目标值(需要被覆盖的值)
fast指针目标值的下一个要留下来的值。
#include<stdio.h>
int removeElem(int* nums, int numsSize, int val);
int main()
{
int arr[5] = { 2,4,2,6,5 };
printf("\n%d\n",removeElem(arr, 5, 2));
return 0;
}
int removeElem(int* nums, int numsSize, int val)
{
int fast, solw = 0;
for (int fast = 0; fast < numsSize; fast++)
{
if (nums[fast] != val)
{
nums[solw] = nums[fast];
solw++;
}
}
for (int i = 0; i < solw; i++)
{
printf("%3d", nums[i]);
}
return solw ;
}

