题目
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。链接
思路
空间换时间,不过不符合题目要求。。
class Solution {
public int findDuplicate(int[] nums) {
int[]numsCount=new int[nums.length+1];
for(int x:nums){
if(numsCount[x]==0){
numsCount[x]=1;
}else{
return x;
}
}
return 0;
}
}
二分查找
由于数组中的元素取值范围为[1,n]
,用一个变量count
记录数组中小于等于某个数的元素个数,则对于target
,所有小于target
的数的count
值必须小于等于其本身,所有大于等于target
的数的count
值必须大于其本身。count
值针对[1,n]
具有单调性。所以找到第一个count
值大于其本身的数即可。
class Solution {
public int findDuplicate(int[] nums) {
int left=0,right=nums.length-1;
while(left<right){
int mid=left+(right=left)/2;
int count=0;
for(int x:nums){
if(x<=mid){
count++;
}
}
if(count<=mid){
left=mid+1;
}else {//当大于count>mid时,一直缩短右边界,直到只剩一个元素,即为target
right=mid;
}
}
return left;
}
}