解法一
思路:先排序 后循环
调用库sort 后循环
时间复杂度 O(nlogn) + O(n)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-1;i++){
if(nums[i]==nums[i+1])
return nums[i];
}
return -1;
}
};
解法二
思路:以空间换时间
创建与原数组相同空间 计算数字出现的个数
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
vector<int> a(nums.size());
for(int i = 0; i < nums.size(); i++){
if(a[nums[i]]>0)
return nums[i];
a[nums[i]]++;
}
return -1;
}
};
解法三
思路:原地置换
根据题目中数字都不大于n的限定条件 可以简化算法
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i=0;i<nums.size();++i){
if(nums[i]==i)
continue;
int t=i;
while(nums[t]!=t){
int temp=nums[nums[t]];
nums[nums[t]]=nums[t];
t=temp;
}
return t;
}
return -1;
}
};
注意:之所以写t=i,是因为i如果被改变,循环无法正常进行
此外vector的初始化和赋值如下:
① vector<int> num2;
② vector<int> num2(num);
③ vector<int> num2=num;
//②③等价
④ vector<int> num2(num.begin(),num.end());
⑤ vector<int> num2(5);
⑥ vector<int> num2(5,0);
//第一个数是vector中元素个数 第二个数是要初始化的值