287. Find the Duplicate Number

    /*
     * 287. Find the Duplicate Number
     * 12.7 by Mingyang 
     * 占位问题,多次遇到过了,另一种解法是Binary Search
     * 如果题目要求不能动这个array,那么占位不行,因为他不能被
     * swap  nums[i] != i 很重要
     */
    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,2,2当把1换到2的时候,下一步走到1就返回1了,所以特别注意这一点
                //错了,是因为1==1,所以返回1,还没做任何事情
                if (nums[i] == nums[nums[i]])
                    return nums[i];
                else
                    swap1(nums, i, nums[i]);
            }
        }
        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; }
原文地址:https://www.cnblogs.com/zmyvszk/p/5634870.html