LeetCode-Remove duplicates from sorted array有序数组移除重复元素

这个题目比较简单就是找到相邻重复的下一个元素的位置,将其复制到前一个重复元素的第二个位置,以此类推,最后后面的那些元素已经废了,返回去重过后的数组的长度。以下是三个版本的去重函数,更多解答参考leetcode题解分享,很精简的解答,都是非常值得学习的代码。

/*
线性表题目主要考察线性表操作,如数组、单链表、双向链表
题目1、Remove duplicates from sorted array从有序数组中移除重复元素思路:因为是有序数组,因此重复元素相邻,指派一个守卫在第一次遇见某元素位置k处,若下一个元素重复,则游标++后移一位,若不相等,则将该元素放到守卫后面,将守卫后移一位,最后守卫的位置就是无重复元素数组的最后一位,因为c++从0快开始计数,因此该非重复数组的长度为守卫的位置+1。
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

int removeDuplicates1(vector<int>& arr)
{
	if (arr.size() == 0) return 0;
	int index = 0;
	for (int i=1;i<arr.size();i++)
	{
		if (arr[index] != arr[i])
			arr[++index]= arr[i];
	}
	return index + 1;
}
int removeDuplicates2(vector<int>&arr)
{
	return distance(arr.begin(), unique(arr.begin(), arr.end()));
}
template<typename In, typename Out>
Out removeDuplicate(In start, In end, Out outPut)
{
	while (start != end)
	{
		*outPut++ = *start;
		start = upper_bound(start, end, *start);
	}
	return outPut;
}
int removeDuplicates3(vector<int>&arr)
{
	return distance(arr.begin(), removeDuplicate(arr.begin(),arr.end(),arr.begin()));
}

int main()
{
	vector<int>arr;
	int data;
	char s;
	while (cin>>data)
	{
		arr.push_back(data);
		s = getchar();
		if (s == '\n') break;
	}
	cout << removeDuplicates1(arr) << endl;
	cout << removeDuplicates2(arr) << endl;
	cout << removeDuplicates3(arr) << endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_18548149/article/details/79543017