leetcode面试经典150题——04删除排序数组中的重复项 II

题目:删除排序数组中的重复项 II

描述
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
leetecode链接

方法一:标记重复出现的元素
同样的思路,对于出现先次数大于2次的元素,从第三个开始进行标记,然后再调用vector的erase函数,把标记了的元素删除,该方法简单易想,且适用于删除重复出现的元素,使得出现次数不超过n次。

int removeDuplicates(vector<int>& nums) {
	int i=0,val;
	int tag = nums[0]-1;//设置一个数组里面没有出现过的值作为标记
	while(i<nums.size()){
		if(i+1<nums.size()&&nums[i]==nums[i+1]){
			val = nums[i];
			i+=2;
			while(i<nums.size()&&nums[i] == val){//从第二个重复的元素往后开始,标记重复出现的元素 
				nums[i++] = tag;
			}
		}else{
			i++;
		}
	}
	//调用erase函数删除标记为tag的元素
	for(vector<int>:: iterator it = nums.begin();it<nums.end();){
		if(*it == tag){
			nums.erase(it);
		}else{
			it++;
		}
	}
	return nums.size();
}

方法二:双指针法
同样的设置两个指针p1,p2,p1指向新数组的最后一个元素,p2指向待检测的元素,观察到,当nums[i]=nums[i-2],这个时候nums[i]元素是需要删除的,因此我们把p2设置为2,p1设置为0,当p1和p2指向的元素不相等的时候,我们需要把p2的元素覆盖到p1的元素,如果前面没有需要删除的,那么就是覆盖自己本身,如果前面有需要删除的,那么覆盖掉的,就是需要删除的元素。


int removeDuplicates(vector<int>& nums) {
	if(nums.size()<3){
		return nums.size();
	}
	int p1 = 2,p2 = 2;
	while(p2<nums.size()){
		if(nums[p1-2]!=nums[p2]){
			nums[p1] = nums[p2];
			p1++;
		}
		p2++;
	}
	return p1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值