原地删除一个排序数组,使得数组中每个元素最多出现两次,并且不不增加额外的数组空间!

一:分析问题
原地删除一个排序数组,使得数组中每个元素最多出现两次,并且不不增加额外的数组空间!_第1张图片
解决方法一

  1. 对于给定的一个数组,我们首先需要被替换的元素,列如实例一中的位置二,即第三个1;
  2. 然后找到可以用来替换的值,即有效值(与nums[i]不同);
  3. 两者进行交换,交换后去重复第一步找到需要被替换的值不断循环;
    代码如下:
int removeDuplicates(vector<int> nums){
	int count=1,i=1;
	if(nums.size<=2)
	return nums.size();
	for(i=1;i<nums.size();i++){//找到可以被替换的值,即有三个以上的重复元素
		if(nums[i]==nums[i-1]){
			count++;
			if(count>2)
			break;
		else
			count=1;//即初始换count值
		}
	}
	//找到有效值去替换
	int j=i+1,t;//作为寻找有效值得索引,和标记有效值
	if(i==nums.size())	return i;//这是没有第三个重复元素的值,上面的循环没有此情况;即1 1 2
	if(j==nums.size())	return i;//这是只有一个三重复元素的序列,即 ...1 1 1  
	//下面进行找有效值
	while(j<nums.size()&&nums[j]==nums[i]{
		j++;
	}
	//如果找不到有效值
	if(j==nums.size())	
		return i;
	else
		t=nums[j];
		count=1;//初始化count值
		i++;
		j++;
	//替换有效值,并且循环进行
	while(j<nums.size()){
	//下面不是直接交换,而是与t比较
		if(nums[j]==t){
			count++;
		if(count>2){
			while(j<nums.size()&&nums[j]==t)
				j++;//一直寻找有效值
			if(j==nums.size()) break;
  			t=nums[j];
  			nums[i]=nums[j];
  			count=1;
  			i++;
  			j++;
  		}
  		else
  		{
  			nums[i]=nums[j];
  			i++;
  			j++;
  		}
  		}
		else{//如果和t值不一样,修改元素值,初始化count
			nums[i]=nums[j];
			count++;
			i++;
			j++;
		}
	}
	return i;
}

解决方法二:
原地删除一个排序数组,使得数组中每个元素最多出现两次,并且不不增加额外的数组空间!_第2张图片
解决方法三
分析:我们可以利用指针进行操作,找到了我们需要替换的值后将后面所有的元素都向前移动一位;设置left和right指针(初始在同一位置),如果left+right+1>2,即找到同一元素的三个重复值。

int removeDuplicates(vector<int>& nums)
{
	int left=0,right=0,t,s=nums.size();
	while(right<s)
	{
		if(nums[left]==nums[right]&&right-left+1<=2)
			right++;
		else if(nums[left]==nums[right]&&right-left+1>2)
		{
			for(t=right+1;t<s;t++)
			{
				nums[t-1]=nums[t];
			}
			s--;
		}
		else
			left=right;
	}
	return s;
}

解决方法四:
使用一种更加简洁的方式,也可以说是方法三的优化版。同样使用双指针,但更为方便;

  1. 使用k指针,他永远指向我们所需要替换的值
  2. 考虑元素重复值最大为2,当我们找到第一个多余元素时。例如(1,1,1,2,2,3),对应的是第三号位置(k),接着比较(最大有效重复元素为2)nums[k-2]和nums[i]即重复元素的首位置和k的下一元素
int removeDuplicates(vector<int>& nums){
	int k=0;
	for(int i=1;i<nums.size();i++)
	{
		if(k<2||nums[k-2]<nums[i])
			nums[k++]=nums[i];
	}
	return k;
}

原地删除一个排序数组,使得数组中每个元素最多出现两次,并且不不增加额外的数组空间!_第3张图片

你可能感兴趣的:(原地删除一个排序数组,使得数组中每个元素最多出现两次,并且不不增加额外的数组空间!)