leetcode面试经典150题——03删除有序数组中的重复项

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

描述
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
leetcode链接

方法一:双指针法
用两个指针p1和p2,p1指向数组第一个元素,p2指向数组第二个元素,p1指向的是第i个不重复元素放置的位置,比较p1和p2所指向的元素,当二者相等时候,p2向后移动,p1不动,当二者不相等时候,这个时候p2指向的元素为第p1+1个不重复的元素,所以应该放在p1+1所指向的元素中(若p2-p1=1则不需要复制),然后让p1,p2都向后移动一位。最后p1所指向的元素即为最后一个不重复的元素,那么p1+1就是新数组的长度。

int removeDuplicates(vector<int>& nums) {
	int p1= 0,p2 = 1;
	while(p2<nums.size()){
		if(nums[p1]!=nums[p2]){
			nums[p1+1] = nums[p2];
			p1++;
		}
		p2++;
	}
	return p1;
}

方法二:本人垃圾方法,看看就好
将数组中所有重复的元素,除了第一个元素以外,把后面出现的重复的元素都做一个标记,也就是只留下第一个重复的元素,然后再用vector的erase删除掉标记的元素

int removeDuplicates(vector<int>& nums) {
	int tag = nums[0]-1;//标记,这里取一个数组中没有的值
	int val,i=0;
	while(i<nums.size()){
		if(i+1<nums.size()&&nums[i] == nums[i+1]){
			val = nums[i++];
			while(i<nums.size()&&nums[i]==val){
				nums[i++] = tag;
			}
		}else{
			i++;
		}
	}
	for(vector<int>::iterator it = nums.begin();it<nums.end();){
		if(*it == tag){
			nums.erase(it);
		}else{
			it++;
		}
	}
	return nums.size();
}

你可能感兴趣的:(leetcode,面试,算法)