题目描述:
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
(来源:LeetCode 链接:https://leetcode-cn.com/problems/find-the-duplicate-number)
解法1 排序
时间复杂度为nlog(n)
对数组进行排序,用sort函数,然后对排序后的数组进行诸葛查找,代码如下:
int findDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
int a = 0;
for(int i = 0;i<nums.size();i++)
{
if(nums[i]==nums[i+1])
{
a = nums[i];
}
}
return a ;
}
这样对原始数组做了修改,,如果原数组为只可读,该方法不可用;
解法2 哈希表
使用哈希表 map ,建立键值映射,当值大于1时,对应的键即为重复值。
空间复杂度为O(n),时间复杂度为O(n)
代码如下:
int findDuplicate(vector<int>& nums) {
map<int,int>mp;
int res=0;
for (int i = 0;i<nums.size();i++)
{
mp[nums[i]]++;
if(mp[nums[i]]>1)
{
res = nums[i];
break;
}
}
return res;
}
解法3 二分法
时间复杂度O(nlog2n)
空间复杂度O(1)
代码如下
int findDuplicate(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
while(left < right) {
int mid = left + (right - left)/2;
int count = 0;
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] <= mid) {
count++;
}
}
if(count > mid) {
right = mid;
}
else {
left = mid + 1;
}
}
return left;
}