题目描述:给定一个排好序的数组,删除其中的重复元素使得每个元素只出现一次,返回去重后的数组长度。要求原地操作。
分析:排好序说明重复元素都是相邻的,要原地操作就只能在原数组上修改元素位置,将不同的元素移到数组前部分。
方法一:设定一前一后两个下标指针,遍历一遍原数组。若快指针指向的元素没出现过,则将此元素赋给慢指针所指位置,两下标同时前移;若出现过则快指针前移。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0)
return 0;
int j = 1;
for (int i = 1; i < nums.size(); i ++)
{
if (nums[i] != nums[i - 1])
nums[j ++] = nums[i];
}
return j;
}
};
方法二:用STL的unique和distance函数,效率更高。
unique作用于数组或vector,作用是将数组中不同的元素移到前部分,重复的元素并未删除,只是移到后面,所以数组大小并没有变,只是返回第一个重复元素的下标。奇怪的是测试发现后移之后会改变重复元素的值。
distance作用于数组或vector,作用是返回两迭代器或下标之间的距离。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return distance(nums.begin(), unique(nums.begin(), nums.end()));
}
};