剑指offer3
作者:互联网
我的想法先排序,再建立一个哈希表,如果大于1,那就返回
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int last=nums[nums.size()-1];
vector<int> num(last+1);
for(int i=0;i<num.size();i++){
num[i]=0;
}
for(int i=0;i<num.size();i++){
num[nums[i]]=num[nums[i]]+1;
}
for(int i=0;i<num.size();i++){
if(num[i]>1){
return i;
}
}
return 0;
}
};
别人:
方法1:哈希表。
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,int> mp;//空的哈希表
for(int i=0;i<nums.size();i++){
if(mp.find(nums[i]) != mp.end()) return nums[i];//查看元素是不是在哈希表里面是返回
else mp[nums[i]] ++;//不在哈希表里面就把这个元素的位置加一
}
return -1;
}
方法2.排序
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=1;i<nums.size();i++){
if(nums[i-1] == nums[i]) return nums[i];//相邻两个元素是不是相同,相同就返回
}
return -1;
}
方法3.抽屉原理。如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。
因为出现的元素值 < nums.size(); 所以我们可以将见到的元素 放到索引的位置,如果交换时,发现索引处已存在该元素,则重复 O(N) 空间O(1)
int findRepeatNumber(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
while(nums[i]!=i){ //不相等[1,2,2],一个一个向后找,想让在第0个位置上的数是0,第1个位置上的数字是1,第二个位置上的数字是2,nums[i](1)是要和nums[nums[i]](2)交换的
if(nums[nums[i]] == nums[i]) return nums[i];//判断,如果原来位置上就有一个和位置一样的数字了比如说nums[2]=2 nums[nums[2]]=2说明重复了,返回这个值
int tmp = nums[i];
nums[i] = nums[tmp];//否则就进行交换。将nums的数字都挪动到数字对应的位置上
nums[tmp] = tmp;
}
}
return -1;
}
标签:return,nums,int,元素,num,offer3,哈希 来源: https://blog.csdn.net/Magic_o/article/details/109906931