287. Find the Duplicate Number

2018-04-11  本文已影响1人  衣介书生

题目分析

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.

可以用二分法来解这个题,时间复杂度为 O(nlog(n)),空间复杂度为 O(1)。

代码

class Solution {
    public int findDuplicate(int[] nums) {
        int min = 0;
        int max = nums.length - 1;
        while(min <= max) {
            // 这里加了 min,所以可以保证,mid 不会小于等于 min,所以最后循环结束的时候,要么 max < min,要么 max == min
            // max < min 的时候,应该返回 min,max == min 的时候,应该返回 min,可以记住返回 min 即可
            int mid = (max - min) / 2 + min;
            int count = 0;
            for(int i = 0; i < nums.length; i++) {
                // 注意这里是直接判断是不是小于等于mid,而不是判断是不是比 nums[mid] 小
                // 比如说 mid 为 5, 那么按照题意,比 5 小的数最多有 4 个,即 1 2 3 4,再算上自己,小于等于自己的最多有 mid 个
                if(nums[i] <= mid) {
                    // 统计整个数组中,比 mid 这个值小的元素的个数
                    count ++;
                }
            }
            if(count > mid) {
                max = mid - 1;
            } else {
                min = mid + 1;
            }
        }
        return min;
    }
}
上一篇下一篇

猜你喜欢

热点阅读