原题链接:Leecode 287. 寻找重复数
解法一:二分
二分的突破口就在于题目中:给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int l=1,r=nums.size()-1;
while(l<r)
{
int mid=l+(r-l)/2;
int tmp=0;
for(auto i: nums)
{
if(i<=mid) tmp++;
}
if(tmp>mid) r=mid;
else l=mid+1;
}
return l;
}
};
解法二:双指针
用快慢指针做这道题之前,先把下面两道题做了:
这两道题都是要用快慢指针做的链表题,做完这两题,了解了快慢指针的思想后,就可以用快慢指针做这道题,只不过是把链表改成了数组,链表的连接关系就是数组中的坐标->值对应关系。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow=0,fast=0;
do
{
slow=nums[slow];
fast=nums[nums[fast]];
}while(slow!=fast);
fast=0;
while(slow!=fast)
{
slow=nums[slow];
fast=nums[fast];
}
return slow;
}
};