【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。


接下来交换他们。


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

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

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


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

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


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



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


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

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


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


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

int removeElement(vector<int>& 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<int>::iterator iter1 = nums.begin();
	vector<int>::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<int>::iterator iter1 = nums.begin();
	vector<int>::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;
	*/
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值