双指针法-------- Leetcode移除元素

问题:

给一个数组 nums 和一个值 val,我们需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

要求:

不使用额外的数组空间(空间复杂度为1),原地修改输入数组。元素的顺序可以改变。不需要考虑数组中超出新长度后面的元素。

首先我们要知道数组删除元素时,只能覆盖不能直接删除。所以整体思路是用要留下来的值覆盖等于val的值。

alt

起初,fast和slow都等于0,都指向2,也有arr[fast]==val; 于是solw不动,暂时记录下来数组中val的值,为后来覆盖做打算,继续循环fast++;如下图所示:

alt

接下来,arr[fast]!=val;将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;继续循环fast++;

alt

arr[fast]==val;solw不动,暂时记录下来数组中val的值,为后来覆盖做打算,继续循环fast++;如下图所示:

alt

接下来,arr[fast]!=val;将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;继续循环fast++;

alt

arr[fast]!=val,将等于val的值覆盖(arr[slow]=arr[fast];)然后slow++;

alt

不难看出删除后的数组长度于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 ;
}
全部评论

相关推荐

ResourceUt...:楼主有自己的垃圾箱,公司也有自己的人才库
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务