给定一个包含 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution: def findDuplicate(self, nums: List[int]) -> int: #数组只能读 所以不能排序,不能swap数组下标 #时间复杂度小于 O(n^2) 不能暴力 #空间复杂度 O(1) 不能额外开辟数组 ''' 1、暴力不符合题意 for i in nums: count = 0 for num in nums: if num == i: count += 1 if count > 1: return i return -1 ''' '''2、小于O(n^2) 二分查找 我们不要考虑数组,只需要考虑 数字都在 1 到 n 之间 示例 1: arr = [1,3,4,2,2] 此时数字在 1 — 5 之间 mid = (1 + 5) / 2 = 3 arr小于等于的3有4个(1,2,2,3),1到3中肯定有重复的值 mid = (1 + 3) / 2 = 2 arr小于等于的2有3个(1,2,2),1到2中肯定有重复的值 mid = (1 + 2) / 2 = 1 arr小于等于的1有1个(1),2到2中肯定有重复的值 所以重复的数是 2 ''' left = 1 right = len(nums) while left < right: mid = int(left + (right - left)/2) cnt = 0 for num in nums: if num <= mid: cnt += 1 if cnt <= mid: left = mid + 1 else: right = mid return right