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