给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
eg1.给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为1,
2
。
你不需要考虑数组中超出新长度后面的元素。
method1:
unique函数要求有序数组,需要注意的是unique函数并不是真正地把元素删除,而是将重复的元素移动到最后了,该函数返回最后一个非重复元素的下一位置。所以,使用unique函数后,再用erase函数删除元素。
erase函数的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
nums.erase(std::unique(nums.begin(),nums.end()),nums.end());
return nums.size();
}
};
method2:
要求原地更改,那么选择双指针试试 up,down
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int up = 0 ,down = 0;
for(int i=0;i<nums.size();i++)
{
if(nums[up]==nums[down]) down++;
else nums[++up] = nums[down++];
}
return ++up;
}
};