287.寻找重复数
https://leetcode-cn.com/problems/find-the-duplicate-number/
解法一:二分
参照官方题解的解法一 cntp[i]表示nums中小于等于i的数有多少个,设重复数为target,则[1,target-1]中所有数满足cnt[i]<=i,[target,n]中所有数满足cnt[i] > i。 二分,每次比较cnt[mid]与mid的关系,判断应该在mid左侧还是右侧继续
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
n = len(nums)
l = 1
r = n-1
while l <= r :
mid = l + (r-l) //2
cnt = 0
for i in range(n): #求cnt[mid]
if nums[i] <= mid:
cnt += 1
if cnt > mid:
r = mid - 1
else:
l = mid + 1
return l
最后更新于