题解
思路
- 快慢双指针
代码
class Solution:
### 0119 二分法(68 ms,16 MB)
def findDuplicate(self, nums: List[int]) -> int:
# 左、右指针初始化为:1 和 n
# 这里的n为数组长度(n+1)减一
l, r = 1, len(nums) - 1
# 左、右指针不相遇时
while l < r:
mid = (l + r) // 2
# 统计小于中间值的个数cnt
cnt = 0
for num in nums:
if num <= mid:
cnt += 1
# 若cnt大于中间值
# 则重复值在左边,否则在右边
if cnt > mid:
# 在左边时边界需要包含mid
r = mid
else:
l = mid + 1
return l # 返回左边界
### 0119 快、慢双指针(40 ms,16.1 MB)
def findDuplicate(self, nums: List[int]) -> int:
# 初始化快慢双指针指向第一个元素
slow = fast = 0
# 首先确定slow和fast的第一个值
slow = nums[slow]
fast = nums[nums[fast]]
# 第一次遍历
# 双指针快、慢进行
while slow != fast:
slow = nums[slow]
fast = nums[nums[fast]]
# 第二次遍历
# 其中一个指针从头开始,再同步进行
slow = 0 # or: fast = 0
while slow != fast:
slow = nums[slow]
fast = nums[fast]
return slow # 返回slow指针