287. Find the Duplicate Number

原创 2016年08月31日 08:24:52

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.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

实际上,我们可以根据抽屉原理简化刚才的暴力法。我们不一定要依次选择数,然后看是否有这个数的重复数,我们可以用二分法先选取n/2,按照抽屉原理,整个数组中如果小于等于n/2的数的数量大于n/2,说明1到n/2这个区间是肯定有重复数字的。比如6个抽屉,如果有7个袜子要放到抽屉里,那肯定有一个抽屉至少两个袜子。这里抽屉就是1到n/2的每一个数,而袜子就是整个数组中小于等于n/2的那些数。这样我们就能知道下次选择的数的范围,如果1到n/2区间内肯定有重复数字,则下次在1到n/2范围内找,否则在n/2到n范围内找。下次找的时候,还是找一半。

注意
我们比较的mid而不是nums[mid]
因为mid是下标,所以判断式应为cnt > mid,最后返回min

主要是边界条件的处理。

public class Solution {
    public int findDuplicate(int[] nums) {
        int low = 1; int high = nums.length-1;

        while(low<high){

            int mid = low + (high-low)/2;
            int cnt = 0;
            for(int num:nums){
                if(num <= mid)
                    cnt++;
            }
            if(cnt <= mid)
            {
                low = mid+1;
            }else{
                high = mid;
            }

        }
        return low;
    }
}

相关文章推荐

Find the Duplicate Number leetcode 287

题目大意:找到数组中唯一的一个重复的数值。时间复杂度要小于O(n^2),不能修改数组了。 发现一个很6的算法,把数组当成一个静态链表,也就是说nums[],数组相当于next[],0为起始节点,节点地...
  • tbestcc
  • tbestcc
  • 2015年09月29日 11:54
  • 424

Leetcode 287. Find the Duplicate Number

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...

Leetcode 287. Find the Duplicate Number

Leetcode :Find the Duplicate Number(找数组中的重复元素)

Leetcode 287. Find the Duplicate Number O(n)解法和O(nlogn)解法

Find the Duplicate Number题目连接:Find the Duplicate NumberDescript Given an array nums containing n +...

Leetcode (287) Find the Duplicate Number

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...

LeetCode 287. Find the Duplicate Number(找重复数字)

原题网址:https://leetcode.com/problems/find-the-duplicate-number/ Given an array nums containing n + 1...
  • jmspan
  • jmspan
  • 2016年04月15日 07:02
  • 771

【Leecode】287Find the Duplicate Number找到重复的数

找到重复的数给一个数组包含n+1个整数,每个整数都是在1到n之间(包括n),证明至少存在一个重复数字。假设只有一个重复的数字,找出这个数 不能修改这个数组,只能用一个常数的额外空间,运行时间复杂度少于...

287. Find the Duplicate Number找环的起点

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...

LeetCode 287. Find the Duplicate Number 题解(C++)

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...

leetcode 287. Find the Duplicate Number

参考博客:https://segmentfault.com/a/1190000003817671  里面介绍很多方法,而且都给出空间和时间复杂度。  选用最后一种方法,学到新算法。Floy...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:287. Find the Duplicate Number
举报原因:
原因补充:

(最多只允许输入30个字)