题目描述
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
示例 1:
输入: [1,3,4,2,2]
输出: 2
示例 2:
输入: [3,1,3,4,2]
输出: 3
说明:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。
解题思路
使用二分的思想,由于数字在1-n之间,统计在mid和1以及mid和n之间的数个数,然后不断递归调用统计计数的函数。
代码(java)
class Solution {
public int findDuplicate(int[] nums) {
int start=1,end=nums.length-1;
while(start<end){
int count=countBi(start,end,nums);
int mid=(end-start)/2+start;
if(count<=mid-start+1){
start=mid+1;
}
else if(count>mid-start+1){
end=mid;
if(end-start==1)break;
}
}
int count_start=0,count_end=0;
for(int num:nums){
if(num==start)count_start++;
if(num==end)count_end++;
}
return count_start>1?start:end;
}
public int countBi(int start,int end,int[] nums){
int mid=(end-start)/2+start;
int count=0;
for(int num:nums){
if(num <= mid && num>=start){
count++;
}
}
return count;
}
}