题目说明:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。
样例:给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。
要求:不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。
算法思想:通过遍历数组,记录重复元素区间的第一个位置和最后一个元素的下一个位置,通过copy将后面的元素往前移动,过滤掉多余的重复元素,同时通过resize更新数组的最新长度,继续遍历,重复该过滤操作。最后返回最新数组的长度。
class Solution {
public:
/*
* @param nums: An ineger array
* @return: An integer
*/
int removeDuplicates(vector<int> &nums) {
if(nums.size() == 0)
return 0;
for(int i = 0; i < nums.size() - 1; i ++){
int count = 0;//记录数组中重复元素出现的个数
if(nums[i + 1] == nums[i]){//出现重复元素时
count ++;
int j = i + 2;//j指的是第一个出现不等于nums[i]对应的索引
while(j < nums.size() && nums[j] == nums[i]){
j ++;
count ++;
}
copy(nums.begin() + j, nums.end(), nums.begin() + i + 1);//将后面的元素往前复制
}
nums.resize(nums.size() - count);//过滤掉多余的元素
}
return nums.size();
}
};