看remove duplicates from sorted array,发现如果用STL的话可以一句话搞定,如下:
class Solution { public: int removeDuplicates(int A[], int n) { return distance(A, unique(A, A + n)); }};
去cplusplus.com上查了unique和distance的用法,如下:
unique:
equality (1) templateForwardIterator unique (ForwardIterator first, ForwardIterator last); predicate (2) templateForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
去除数组中存在连续的重复的元素,只保留第一个。方法返回an iterator to the element that follows the last element not removed(表达能力拙计,直接上英文原话吧)。
也可以自定义predicate,相当于自己写remove的规则。
一个例子如下:
/ unique algorithm example#include// std::cout#include // std::unique, std::distance#include // std::vectorbool myfunction (int i, int j) { return (i==j);}int main () { int myints[] = { 10,20,20,20,30,30,20,20,10}; // 10 20 20 20 30 30 20 20 10 std::vector myvector (myints,myints+9); // using default comparison: std::vector ::iterator it; it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ? // ^ myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30 20 10 // using predicate comparison: std::unique (myvector.begin(), myvector.end(), myfunction); // (no changes) // print out content: std::cout << "myvector contains:"; for (it=myvector.begin(); it!=myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0;}
distance:
templatetypename iterator_traits ::difference_type distance (InputIterator first, InputIterator last);
就是返回两个迭代器之间的距离。
回到一开始leetcode的那个例子,因为unique返回的是the iterator to the element which follow the last element,所以一头一尾直接算出了去除重复元素之后的数组的长度。