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;
*/
}