[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;
	}
}
原文地址:https://www.cnblogs.com/coding-gaga/p/12289453.html