1、思路:双指针
先排除不在[0,n-1]范围内的数,然后从头到尾遍历数组,每一层遍历都用另一个指针从尾到当前数,判断是否相等,相等即返回该数。
时间复杂度:最坏情况遍历n*(n-1)次
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
for(auto it:nums){
if(it < 0 || it > nums.size()-1)
return -1;
}
for(int i = 0; i < nums.size(); i++){
for(int j = nums.size()-1 ; i < j;j--){
if(nums[i] == nums[j])
return nums[i];
}
}
return -1;
}
};
2、思路:用set容器,遍历数组,如果数组长度没有增加,说明重复,返回该数。
时间复杂度:
lass Solution {
public:
int duplicateInArray(vector<int>& nums) {
set<int> a;
for(int i=0;i<nums.size();i++)//先筛选数组中是否有在 0∼n−1 的数,有就返回-1
{
if(!(nums[i]>=0 && nums[i]<=nums.size()-1)) return -1;
}
//筛选重复数字,利用set的自动删除重复性质来判断
for(int i=0;i<nums.size();i++)
{
int now=a.size();//还未插入新元素时数组中的元素个数
a.insert(nums[i]);//插入元素,若nums[i]与set中的元素不重复,则成功插入,size+1,否则,
//size保持不变
if(now==a.size()) return nums[i];
}
return -1;
}
};