您的位置:首页 > 编程语言 > Java开发

287. Find the Duplicate Number

2016-08-31 18:09 309 查看
287.Find the Duplicate Number

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.


由于不能使用额外的空间,不能使用记录或统计出现的数,又不能破坏数组结构,不能通过排序来判断相邻数是否相等。

二分法,因为数出现在[1,n]。所以统计[1-n/2]的数,如果出现小于等于n/2的数个数超过n/2,[1-n/2]数中有重复的数,继续通过二分减少搜索范围,这里的时间复杂度为nlogn

public class Solution {
public int findDuplicate(int[] nums) {
int low=0,high=nums.length-1;
int mid;
while(high>low){
mid=(low+high)/2;
int count=0;
for(int i=0;i<nums.length;i++){
if(nums[i]<=mid)
count++;
}
if(count>mid)
high=mid;
else
low=mid+1;
}
return low;
}
}


其他算法:映射找环路法

public class Solution {
public int findDuplicate(int[] nums) {
int slow = 0;
int fast = 0;
// 找到快慢指针相遇的地方
do{
slow = nums[slow];
fast = nums[nums[fast]];
} while(slow != fast);
int find = 0;
// 用一个新指针从头开始,直到和慢指针相遇
while(find != slow){
slow = nums[slow];
find = nums[find];
}
return find;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode