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:
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than
O(n2)
. - There is only one duplicate number in the array, but it could be repeated more than once
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的话,不就死循环了吗?看来是特例特思。