【leetcode c++】80 Remove Duplicates from Sorted Array II

临近期末,转移战场,考完回家,家里怒报驾校,应接不暇。进正题

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值