1 题目
题目:去除重复元素(Remove Duplicate Numbers in Array)
描述:给一个整数数组,去除重复的元素。你应该做这些事:1.在原数组上操作;2.将去除重复之后的元素放在数组的开头;3.返回去除重复元素之后的元素个数。不需要保持原数组的顺序。
lintcode题号——521,难度——easy
样例1:
输入:nums = [1,3,1,4,4,2]
输出:
[1,3,4,2,?,?]
4
解释:
1. 将重复的整数移动到 nums 的尾部 => nums = [1,3,4,2,?,?].
2. 返回 nums 中唯一整数的数量 => 4.
事实上我们并不关心你把什么放在了 ? 处, 只关心没有重复整数的部分.
样例2:
输入:nums = [1,2,3]
输出:
[1,2,3]
3
2 解决方案
2.1 思路
使用两个指针,一个指针从左向右指示当前的需要填充的位置,一个指针用于从左向右找不重复的数,然后不断地将不重复的数向前填充即可。
2.2 时间复杂度
时间复杂度为O(n)。
2.3 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 同向双指针法,left从左往右一步一步走,right从左往右依次寻找不重复的数,依次将不重复的数填充到left位置。
- 判断重复可以使用set数据结构。
C++版本:
/**
* @param nums: an array of integers
* @return: the number of unique integers
*/
int deduplication(vector<int> &nums) {
// write your code here
if (nums.empty())
{
return 0;
}
set<int> duplicate;
int left = 0;
int right = 0;
while (right < nums.size())
{
if (duplicate.find(nums.at(right)) == duplicate.end())
{
swap(nums.at(left), nums.at(right));
duplicate.insert(nums.at(left));
left++;
}
right++;
}
return left;
}