数组中重复的数字
找出数组中重复的数字,在一个长度为n的数组 nums 里所有的数字都在0~n-1的范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字
方法1、哈希法
新建集合,然后添加数组中的元素,当重复时, 返回重复数字
set:存储元素不重复,无序,只支持成员赋值操作,迭代,枚举;不支持索引,重复,切片
class Solution:
def findRepeatNumber(self, nums)
dic = set() #新建空集合
for i in nums:
if i in dic:
return i
dic.add()
class Solution{
public:
int findRepeatNumber(vector<int>& nums)
{
unordered_map<int, bool>m;
for(vector<int>::iterator it=nums.begin();it!=nums.end();it++)
{
if (m[*it]) ###下标访问不会做检查,如果下标访问会插入不存在的key,对应的value为默认值
{
return (*it);
}
m[*it] = false;
}
return -1;
}
}
方法2、原地交换
将数组的元素交换至与索引一致的位置
如果原本就一致,无需交换 ,索引加一
如果不一致,进行交换,每次循环进行一次交换
如果索引到与该元素交换后索引的元素一致的条件下,则找到重复的数字
class Soultion:
def findRepeatNumber(self, nums):
i = 0
while (i < len(nums)):
if (nums[i] == i):
i += 1
continue
if (nums[i] == nums[nums[i]]):
return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1
class Soultion:
def findRepeatNumber(vector<int>nums)
{
int len = nums.size();
int i =0;
while(i < len)
{
if(nums[i] == i)
{
i++;
continue;
}
if(nums[i] == nums[nums[i]])
{
return nums[i];
}
swap(nums[i], nums[nums[i]]);
}
}