双指针移除元素

发布于:2022-10-28 ⋅ 阅读:(566) ⋅ 点赞:(0)

一、题目详情

1、题目链接:

leetcode移除元素

2、题目内容:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函
数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,
而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100

二、题目详解

1、方法1

看到这道题首先想到的应该是顺序表中接口函数的实现。
思路如下图所示,只要遇到val就让后面的元素向前移动,直到覆盖所有的lv
在这里插入图片描述

int removeElement(int* nums, int numsSize, int val)
{
	int k = 0;
	int count = numsSize;
	for (int i = 0; i < numsSize; i++)
	{
		while (nums[i] == val)
		{
			for (int j = i; j < numsSize - 1; j++)
			{
				nums[j] = nums[j + 1];
			}
			count--;
		}
	}
	return count;
}

时间复杂度:O(N2)
空间复杂度:O(1)

我们发现上述的时间复杂度并不符合题目的要求。

2、方法2:

我们可以采用空间换时间的策略,我们开辟一个新的数组,然后遍历原数组,如果数组中的元素不是val那么就放到临时数组中,最后再将临时数组中的内容拷贝给原数组。

int removeElement(int* nums, int numsSize, int val)
{
	int temp[numsSize];
	int k = 0;
	for(int i=0;i<numsSize;i++)
	{
		if (nums[i] != val)
		{
			temp[k++] = nums[i];
		}
	}
	for (int i = 0; i < k; i++)
	{
		nums[i] = temp[i];
	}
	return k;

}

时间复杂度:O(N)
空间复杂度:O(N)

虽然这种方法使得时间复杂度相对降低,但是空间复杂度提升了。而原题目也说了不开辟额外的空## 间。所以这种方法也是不合适的。

3、方法3:

既然要求原地移动元素,我们只能考虑双指针了。
我们创建一个des,这个指针就是从头开始移动,src也从des的位置开始移动,src向右寻找第一个不是val的数值,然后将这个数值赋值给des。最终返回des的值。
在这里插入图片描述

int removeElement(int* nums, int numsSize, int val)
{
	int des = 0;
	int src = 0;
	while (src < numsSize)
	{
		if (nums[src] != val)
		{
			nums[des] = nums[src];
			des++;
			src++;
		}
		else
		{
			src++;
		}
	}
	return des;
}

在这里插入图片描述
时间复杂度:O(N)
空间复杂度:O(1)

第三种方法即是最优解。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到