[LeetCode]287. 寻找重复数(二分)

题目

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

示例 1:

输入: [1,3,4,2,2]
输出: 2
示例 2:

输入: [3,1,3,4,2]
输出: 3
说明:

不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-duplicate-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 若是没有空间复杂度要求,直接用HashMap
  • 是特别的使用二分的一个题
  • 由闭区间考虑出发,代码需要结合实际情况判断是否是=,是否-1,具体见代码注释。

代码

class Solution {
    public int findDuplicate(int[] nums) {
        int l = 1; // l r mid 不再代表索引 而是元素值
        int r = nums.length - 1;// 本质是对数组1 2 3 ... n进行二分
        while (l < r) { // 为了最终锁定重复元素
            int mid = l + (r - l) / 2;

            int cnt = 0;
            for (int num : nums) {
                if (num <= mid) {
                    cnt++;
                }
            }

            if (cnt <= mid) { // 重复的数可能重复多次,所以其他元素次数也可能为0
                l = mid + 1;
            } else {
                r = mid; // 结合实际意义可得
            }
        }
        return l;
    }
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/12289453.html