临近期末,转移战场,考完回家,家里怒报驾校,应接不暇。进正题
Remove Duplicates from Sorted Array II
Follow up for "RemoveDuplicates":
What if duplicates are allowed at mosttwice?
For example,
Given sorted array nums = [1,1,1,2,2,3],
Your function should return length = 5,with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn't matterwhat you leave beyond the new length.
Remove Duplicates from Sorted Array一号已经做过了。在26Remove Duplicates fromSorted Array。
这次就做了小改变:重复元素有3个或以上时,保留2个元素(一号题是保留1个)。
好像不怎么难的样子,偶然看到这题有二号题,就手滑进来做了。真是折煞我也。一开始做了出来第一个版本,但是效率比较低。后来改进了一下循环的思路,效率好多了。但是最基本的出发点还是那个,边扫描边交换。
我们把将要被移除的元素叫做垃圾元素好了,被保留下来的叫保留元素。
在做的过程中,我把思路在总体上分成了两块,一是当前已经有垃圾元素了,二是目前还没有垃圾元素。因为这两个情况我还没办法用一个通用方法解决。
世界都是从无到有的。所以只能先进行【没有垃圾元素情况的扫描循环】。
指针指向数组首。
我们让指针2向后扫描,直到与指针1指向的元素不同。
这时候我们就要统计,指针1所指的元素的个数了。当个数等于2时,不要用移除。那么,我们让指针1指向指针2所在。
继续开始的扫描方法,直到,重复元素超过2个时候。这时候要进行交换操作了
这时,元素个数是4个4,我们指针1重新定位就不能指向指针2所指了。而是指向第三个重复元素。
然后交换它们。
不要急,还有一步,我们让指针2后移。
为什么要后移,后移之后你会发现,两个指针之间的元素都是垃圾元素了。
到目前为止的扫描方法,是没有出现垃圾元素(重复超过2)的扫描。**************************************************************************************************************
这时候,出现了重复元素超过2的情况了,跳出【没有垃圾元素情况的扫描循环(init_loop)】我们开始进入【有垃圾元素的情况的扫描循环(main_loop)】了。也就是说,现在的扫描结果是,已经在数组中存在需要删除(后移)的元素了。
还是刚才的数组,我稍微补充了后续。这时候两个指针之间是垃圾元素。
我们判断这两个指针的所指。发现是相同元素:5,我们统计个数,目前只扫描到了2个5,因此指针2所指的元素【不是】垃圾元素。我们进行交换操作,保留下这个元素。
不要急,还有一步,我们让指针2后移。
交换好了,继续看这两个指针的所指。发现是相同元素:5,我们统计个数,目前扫描到了3个了,因此,之后指针2所指凡是和指针1所指的元素相同的,都是垃圾元素。那么,我们就让指针2向后扫描,直到出现不同于指针1的所指。
找到不同于指针1的元素之后,这时候。两个指针之间的元素就都是垃圾元素了。重复上述扫描,直到指针2到尾。所求数组出来。
所求长度就是指针1所走距离。
Leetcode的AcceptedSolutions Runtime Distribution
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void outVector(vector<int>& nums);
int removeDuplicates(vector<int>& nums);
int main()
{
vector<int> nums;
nums.push_back(0);
nums.push_back(1);
nums.push_back(1);
/*nums.push_back(0);
nums.push_back(1);
nums.push_back(1);
/*nums.push_back(2);
nums.push_back(2);
nums.push_back(3);
nums.push_back(4);
nums.push_back(4);
nums.push_back(4);*/
cout << removeDuplicates(nums);
return 0;
}
int removeDuplicates(vector<int>& nums){
vector<int>::iterator iter1 = nums.begin();
vector<int>::iterator iter2 = nums.begin();
/
//init_loop
int res = 0;
int count = 0;
while (iter2 != nums.end())
{
while (*iter2 == *iter1)
{
*iter2++;
count++;
if (iter2 == nums.end())
{
if (count > 2)
{
res += 2;
}
else res += count;
return res;
}
}
if (count == 1)
{
iter1++;
res += 1;
count = 0;
continue;
}
else if (count == 2)
{
iter1++;
iter1++;
res += 2;
count = 0;
continue;
}
else
{
iter1++;
iter1++;
res += 3;
}
swap(*iter1,*iter2);
*iter2++;
break;
}
//init_loop_another
/*
int res = 0;
int count = 0;
while (iter2 != nums.end())
{
while (*iter2 == *iter1 && 2 != count)
{
iter2++;
res++;
count++;
if (iter2 == nums.end())
{
break;
}
}
if (iter2 == nums.end())
{
break;
}
else if (*iter2 != *iter1)
{
iter1 = iter2;
count = 0;
continue;
}
else
{
iter1 = iter2;
while (*iter2 == *iter1)
{
iter2++;
if (iter2 == nums.end())
{
break;
}
}
if (iter2 == nums.end())
{
break;
}
swap(*iter1, *iter2);
res++;
*iter2++;
break;
}
}
*/
//
//main_loop
outVector(nums);
while (iter2 != nums.end())
{
if (*iter1 == *iter2)
{
iter1++;
res++;
swap(*iter1, *iter2);
*iter2++;
outVector(nums);
if (iter2 == nums.end())
{
return res;
}
outVector(nums);
while (*iter1 == *iter2)
{
iter2++;
if (iter2 == nums.end())
{
return res;
}
}
}
else
{
iter1++;
res++;
swap(*iter1, *iter2);
*iter2++;
outVector(nums);
if (iter2 == nums.end())
{
return res;
}
}
}
return res;
///
//main_bad_bad
/*count = 1;
bool canSwap = true;
while (iter2 != nums.end())
{
while (!canSwap && *iter1 >= *iter2)
{
iter2++;
count++;
if (iter2 == nums.end())
{
if (canSwap)
{
if (count > 2)
{
iter2 = iter1;
iter2++;
*iter1 = *iter2;//swap()
res += 2;
}
else res += count;
}
return res;
}
}
if (canSwap && *iter1 <= *iter2)
{
if (*iter1 == *iter2)
{
canSwap = false;
}
iter1++;
*iter1 = *iter2;//swap()
res++;
iter2++;
count = 0;
continue;
}
else if (*iter1 < *iter2)
{
iter1++;
*iter1 = *iter2;//swap()
res++;
canSwap = true;
iter2++;
continue;
}
else if (canSwap)
{
iter1++;
res++;
*iter1 = *iter2;//swap()
iter2++;
}
}
return res;*/
}
void outVector(vector<int>& nums){
vector<int>::iterator i = nums.begin();
while(i != nums.end())
{
cout << *i << " ";
i++;
}
cout << endl;
}