思路

利用algorithm中的sort函数对数组排序,然后利用两个指针遍历数组,返回第一个两个指针指向值相同的元素。如果没有重复元素,那么指针最后会一直往后走,这里一定要考虑边界情况,


代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        sort(numbers.begin(),numbers.end());
        int i = 0;
        int j = 1;
        //防止空集合的出现(如果数组为空,直接返回-1)
        if(j>=numbers.size())
            return -1;
        while(numbers.at(i)!=numbers.at(j)&&j<numbers.size()) 
        {
            i++;
            j++;
        }
      	//如果j>=numbers.size(),则证明无重复元素
        if(j>=numbers.size())
            return -1;
        else
            return numbers[i];
    }
};

sort函数的用法

sort 在 STL 库中是排序函数,有时冒泡、选择等 O(n2) 算***超时时,我们可以使用STL中的快速排序函数 O(nlogn) 完成排序。

sort函数的原型如下

template <class RandomAccessIterator>
 void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
 void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

可以看到sort函数有两个参数和三个参数两种形式。

sort函数(两个参数形式)

sort函数的前两个参数是起始地址和终止地址的下一地址,如对数组a[100]排序:区间是a[0]到a[99],但是要写成sort(a,a+100)。
对向量(vector)排序:sort(v.begin(),v.end())。

sort函数(第三个参数)

sort函数的第三个参数是比较函数。使用前两个参数排序默认是升序的,如果想实现降序的话,则需要使用第三个参数。例如:

//自定义比较函数
bool cmp(int a,int b)
{
  	return a>b;
}
int main()
{
  	int a[10]={1,5,6,4,3,2,4,9,10,7};
  sort(a,a+10,cmp);
}

可以看出第三个参数就是利用了回调函数。