题目描述
思路 使用哈希表
class SolutionHash
{
public:
int findRepeatNumber(vector<int> &nums)
{
unordered_map<int, int> count;//哈希表变量
for (int n : nums)
{
if (++count[n] > 1)//在哈希表中插入元素 size为插入的元素个数 每插入一个新元素 key为n value默认值为0
return n;
}
return -1;
}
};
使用数组 构建一个大小为n-1的数组,把数字i存储在n-1的位置,如果遇到n-1的元素是i,说明是重复的数字。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
//int i=0;
int len=nums.size();
int* map=new int[len];
//cout<<map[0]<<endl;
for(int i=0;i<len;i++)
{
int key=nums[i];
if(map[key]!=key)
{
map[key]=key;
}
else
{
return key;
}
}
return 0;
}
};
数组排序的方法 如果i和num[i]不相等的情况下,交换位置,
class Solution {
public:
int findRepeatNumber(vector<int>& nums)
{
int len=nums.size();
for (int i=0;i<len;i++)
{
int key=nums[i];
while(key!=i)//当位置不同时进入
{
if(nums[key]==key)
{
return key;
}
swap(nums[key],nums[i]);
}
}
return 0;
}
};
二分法查找(题目需要变成 长度为n+1的数组 数字在0-n内)
1,变量为区间,不断缩小的区间是最终找到重复数字的关键点
2,循环整个数组,找到某一区间的计数值
int count(int begin, int endl, vector<int>& nums, int len)
{
int count=0;
for (int i = 0;i < len;i++)
{
if (nums[i] >= begin && nums[i] <= endl)
{
count++;
}
}
return count;
}
int findRepeatNumber(vector<int>& nums)
{
int len = nums.size();
int start = 1;
int endl = len - 1;
int midle;
while (start <= endl)
{
midle = start + (endl - start) / 2;
cout << "midle" << midle << std::endl;
int count1 = count(start, midle, nums, len);
cout << "count1" << count1 << std::endl;
if (endl == start)//找完了
{
if (count1 > 1)
{
return start;
}
else { break; }
}
if (count1 > (midle - start + 1))
{
endl = midle;
cout << "s" << midle << std::endl;
}
else
{
start = midle + 1;
}
}
return 0;
}