给出一个数组 nums
包含 n + 1
个整数,每个整数是从 1
到 n
(包括边界),保证至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
注意事项
1.不能修改数组(假设数组只能读)
2.只能用额外的O(1)的空间
3.时间复杂度小于O(n^2)
4.数组中只有一个重复的数,但可能重复超过一次
样例
给出 nums
= [5,5,4,3,2,1]
,返回 5
.
给出 nums
= [5,4,4,3,2,1]
,返回 4
.
1 int findDuplicate(vector<int> &nums) { 2 // write your code here 3 int left=1,right=nums.size()-1; 4 int mid=left+(right-left)/2; 5 int left_num; 6 while(left<right){ 7 left_num=0; 8 for(int i=0;i<nums.size();i++){ 9 if(nums[i]<=mid){ 10 left_num++; 11 } 12 } 13 14 if(left_num<=mid){ 15 left=mid+1; 16 } 17 else{ 18 right=mid; 19 } 20 mid=left+(right-left)/2; 21 } 22 return mid; 23 }
自己没想出来,照着网上的思路写了一个
left是1,right是n。mid算出来以后遍历数组,看有多少小于等于它的,如果统计的数量小于等于mid这个数的本身,就说明重复的数在比mid大的那边。
于是就left=mid+1(因为不够嘛所以不要了)或者right=mid。最后left=right的值就是所求