码迷,mamicode.com
首页 > 其他好文 > 详细

287. Find the Duplicate Number

时间:2016-07-02 10:21:12      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 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

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5634870.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!