287. Find the Duplicate Number

Posted 我的名字叫周周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了287. Find the Duplicate Number相关的知识,希望对你有一定的参考价值。

    /*
     * 287. Find the Duplicate Number
     * 12.7 by Mingyang 
     * 占位问题,多次遇到过了,另一种解法是Binary Search
     * 如果题目要求不能动这个array,那么占位不行,因为他不能被
     * swapnums[i] != i + 1很重要
     */
    public static int findDuplicate1(int[] nums) {
        int len = nums.length;
        if (nums == null || nums.length == 0)
            return 0;
        for (int i = 0; i < len; i++) {
            while (nums[i] != i + 1) {
                // 为什么这么个条件呢,因为有可能遇到这种情况,
                //1,2,2当把1换到2的时候,下一步走到1就返回1了,所以特别注意这一点
                //错了,是因为1==1,所以返回1,还没做任何事情
                if (nums[i] == nums[nums[i] - 1])
                    return nums[i];
                else
                    swap1(nums, i, nums[i] - 1);
            }
        }
        return 0;
    }
    //下面是最好的方法,就是说我们需要计算比中间值小的个数
    public int findDuplicate(int[] nums) {
        int n = nums.length - 1;
        int low = 0, high = n;
        int mid = 0;
        while (low < high) {
            mid = low + (high - low) / 2;
            int c = count(nums, mid); // count #numbers less than mid.一定有一个值,所以不用等于
            if (c <= mid) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    }
    private int count(int[] nums, int mid) {
        int c = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] <= mid)
                c++;
        }
        return c;
    }

 

以上是关于287. Find the Duplicate Number的主要内容,如果未能解决你的问题,请参考以下文章

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number