mirror of
https://gitlab.com/game-loader/hugo.git
synced 2025-04-20 05:52:07 +08:00
leetcode update
This commit is contained in:
parent
1505b4cc21
commit
cebf10de23
@ -1972,3 +1972,46 @@ func reorderList(head *ListNode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## day27 2024-03-24
|
||||||
|
|
||||||
|
### 287. Find the Duplicate Number
|
||||||
|
|
||||||
|
Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive.
|
||||||
|
|
||||||
|
There is only one repeated number in nums, return this repeated number.
|
||||||
|
|
||||||
|
You must solve the problem without modifying the array nums and uses only constant extra space.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 题解
|
||||||
|
|
||||||
|
根据鸽笼原理, 显然必有一个数字有一个重复数字. 最简单的思路就是用每个数和数组其余数字比较, 直到找到相同的数为止, 显然这个方法的时间复杂度比较高, 要O(n^2). 最终并没有想出题目中要求的时间复杂度为O(n), 空间复杂度为O(1)的解法, 看题解得知使用的是Floyd 循环检测算法, 这个算法一般用于检测链表中是否存在环, 即使用快慢指针, 同时遍历链表, 如果存在环, 快指针最终会追上慢指针. 如果链表没有环, 则遍历链表最终会到达空指针自然停止, 这里的快慢指针是给了未知长度的链表一个停止条件, 可以避免若链表有环无限循环遍历下去. 这里将数组堪称链表是非常精妙的思路, 将数组中的值看作下一个节点在数组中的下标, 这样如果有两个节点相同, 则最终快指针和慢指针指向的下标会相同, 再从头遍历一次数组, 找到值为这个下标的数据, 即为重复的数.
|
||||||
|
|
||||||
|
### 代码
|
||||||
|
|
||||||
|
```go
|
||||||
|
func findDuplicate(nums []int) int {
|
||||||
|
// Step 1: Find the intersection point of the two pointers
|
||||||
|
slow := nums[0]
|
||||||
|
fast := nums[0]
|
||||||
|
|
||||||
|
for {
|
||||||
|
slow = nums[slow]
|
||||||
|
fast = nums[nums[fast]]
|
||||||
|
if slow == fast {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: Find the entrance to the cycle (duplicate number)
|
||||||
|
slow = nums[0]
|
||||||
|
for slow != fast {
|
||||||
|
slow = nums[slow]
|
||||||
|
fast = nums[fast]
|
||||||
|
}
|
||||||
|
|
||||||
|
return slow
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user