【leetcode c++】27 Remove Element

Remove Element

Given an array and a value, remove allinstances of that value in place and return the new length.

The order of elements can be changed. Itdoesn't matter what you leave beyond the new length.

 

在数组中删除给定的元素。这里没有具体说明,那么,这个元素可能是零散分布的。

 

本着一次扫描的思路,还是得变扫描变交换。不用erase是因为效率的问题,之前的博客有说过了。题目也隐晦的提示,用赋值或者交换就好。

 

借着前面的题的思想,我们对这道题也来一个边扫描数组边交换的思路。

我们把被删除的元素叫做垃圾元素好了。

首先,先定位垃圾元素。用两个指针来定位,离数组首最近的垃圾元素-指针1和最近的保留元素-指针2。

【leetcode c++】27 Remove Element_第1张图片

接下来交换他们。

【leetcode c++】27 Remove Element_第2张图片

这时候,指针1指向的是保留元素了,而指针2指向了垃圾元素。

我们的本意是用指针1指向离数组首最近的垃圾元素,指针2离数组首最近的保留元素。

那么我们就继续找,让指针1指向离数组首最近的垃圾元素,指针2离数组首最近的保留元素。

【leetcode c++】27 Remove Element_第3张图片

【leetcode c++】27 Remove Element_第4张图片

很快就找到了,就这么找下去。

到了某一步,突然垃圾元素变多了。

【leetcode c++】27 Remove Element_第5张图片

没关系,指针2多往前走几步。

【leetcode c++】27 Remove Element_第6张图片

【leetcode c++】27 Remove Element_第7张图片

当到达收尾阶段,就是指针2不能在找到保留元素了,我们就判断指针2到尾时结束处理。

【leetcode c++】27 Remove Element_第8张图片

题目要求返回新数组的长度,其实就是指针1所走的距离了。

这样,就能用交换的方式解决本题了。


Leetcode的AcceptedSolutions Runtime Distribution(15-06-07)

【leetcode c++】27 Remove Element_第9张图片

源码://里面有一段备注释掉的代码,上面说的思路是,开始先定位两个指针,之后两个指针扫描,那么代码上就分成两个部分。注释掉的代码的思路是每次循环都让指针2重新再定位,这样把两部分代码合并了,但是指针2多做了扫描。

int removeElement(vector& nums, int val) {

	
	//leetcode27
	

	
	int len = nums.size();
	if (0 == len) return 0;
	if (1 == len)
	{
		if (val == nums[0]) return 0;
		else return 1;
		//return val == nums[0] ? 0 : 1 ;
	}
	/
	len = 0;
	//定位,就是定位到图示的第一幅图
	vector::iterator iter1 = nums.begin();
	vector::iterator iter2;
	while (val != *iter1 && nums.end() != iter1)
	{
		iter1++;
		len++;
	}
	if (nums.end() == iter1) return len;
	iter2 = iter1;
	while (val == *iter2 && nums.end() != iter2)
	{
		iter2++;
	}//定位结束

	while (nums.end() != iter2)
	{
		while (val != *iter1)//找最近的垃圾元素
		{
			iter1++;
			len++;
		}
		while (val == *iter2)//找最近的保留元素
		{
			iter2++;
			if (iter2 == nums.end()) return len;
		}
		swap(*iter1, *iter2);//交换
		//showVector(nums);
		iter1++;
		len++;
		iter2++;
	}
	return len;
	/*
	int len = nums.size();
	if (0 == len) return 0;
	if (1 == len)
	{
		if (val == nums[0]) return 0;
		else return 1;
		//return val == nums[0] ? 0 : 1 ;
	}
	len = 0;
	vector::iterator iter1 = nums.begin();
	vector::iterator iter2;
	while (nums.end() != iter2)
	{
		while (val != *iter1 && nums.end() != iter1)
		{
			iter1++;
			len++;
		}
		if (nums.end() == iter1) return len;
		iter2 = iter1;
		while (val == *iter2)
		{
			iter2++;
			if (iter2 == nums.end()) return len;
		}
		swap(*iter1, *iter2);
		//showVector(nums);
		iter1++;
		len++;
		iter2++;
	}
	return len;
	*/
}


你可能感兴趣的:(leetcode)