题目
找出数组中重复的数字
在一个长度为n 的数组nums里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
输入:
[2 , 3., 1, 0 ,2,5,3]
输出:2 或 3
哈希表解法
建立哈希表,把重复元素返回,时间复杂度为o(n)
c++版本:
#include<unordered_map>
#include<iostream>
using namesapce std;
class Solution{
public:
int findRepeatNumber(vector<int>& nums){
unordered_map<int,bool>map;
for(int num:nums){
if(map[num]) return num;
map[num]=true;
return -1;
}
}
};
int main(){
Solution s;
s.findRepeatNumber([2,3,1,0,2,5,3]);
system("pause");
return 0;
}
python 版本:
class Solution(object):
def findRepeatNumber(self,nums):
dic=set()
for num in nums:
if num in dic:
return num
dic.add(num)
return -1
原地交换法
利用题目描述的,数组nums里的所有数字都在0~n-1的范围内,那我们可以利用索引与元素出现一对多的异常点来找出重复元素,即借助索引为桥梁去搜索。
python 版本:
class Solution(Object):
def findRepeatNumber(self,nums):
for i in range(len(nums)):
if nums[i]==i:continue
if nums[nums[i]]==nums[i]: return nums[i]
nums[nums[i]],nums[i]= nums[i],nums[nums[i]]
return -1
c++ 版本:
class Solution{
public:
int findRepeatNumber(vector<int>& nums){
for(int i=0;i<nums.size();i++){
if(nums[i]==i) continue;
if(nums[nums[i]]==nums[i]) return nums[i];
swap(nums[nums[i]],nums[i]);
}
return -1;
}
};