标签:
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
O(n2).class Solution {
public:
int findDuplicate(vector<int>& nums) {
int min=1,max=nums.size();
while(min<=max)
{
int mid=(min+max)/2;
int cnt=0;
for(int i=0;i<nums.size();i++)
if(nums[i]<=mid)
cnt++;
if(cnt>mid)
max=mid-1;
else
min=mid+1;
}
return min;
}
};
二分查找的思路,如何1到n/2有重复的,那么1到n/2的数字个数一定大于n/2这个数本身。下面是网上别人的思路,看不懂。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow = 0;
int fast = 0;
int finder = 0;
while (true)
{
slow = nums[slow];
fast = nums[nums[fast]];
if (slow == fast)
break;
}
while (true)
{
slow = nums[slow];
finder = nums[finder];
if (slow == finder)
return slow;
}
}
如果第一个数为0的话,不就死循环了吗?看来是特例特思。
LeetCode() Find the Duplicate Number
标签:
原文地址:http://www.cnblogs.com/yanqi110/p/4977404.html