给定一个排序数组,你需要在删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在修改输入数组并在使用 O(1) 额外空间的条件下完成。
我的实现:(效率很低,276ms)
class Solution {public: int removeDuplicates(vector & nums) { int ret = nums.size(); for (int i = 0 ; i< ret - 1;) { if(nums.at(i) != nums.at(i+1)) { ++i; continue; } else { for(int j = i ; j < ret-1; ++j) { nums.at(j) = nums.at(j+1); } ret--; } } return ret; }};
大神实现:(16ms)
1 class Solution {2 public:3 int removeDuplicates(vector & nums) {4 nums.erase(std::unique(nums.begin(), mums.end()), nums.end());5 return noms.size();6 }7 }
std::unique,
消除连续组中的除了第一个元素的其他相同的元素;
消除后的元素之间的相对位置不变;
返回新的past-the-end;
参考std::unique的实现了一个版本:(28ms)
class Solution {public: int removeDuplicates(vector & nums) { int ret = 1; vector ::iterator beginIter = nums.begin(); vector ::iterator endIter = nums.end(); if(beginIter == endIter) return 0; vector ::iterator resultIter = beginIter; while(++beginIter != endIter) { if((*beginIter != *resultIter) ) { ++resultIter; *resultIter = std::move(*beginIter); ++ret; } } ++resultIter; return ret; }};