287. Find the Duplicate Number

来源:互联网 发布:mysql 表合集 编辑:程序博客网 时间:2024/04/29 20:44

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;    }}
0 0