标签:complex ESS sub fas and ble highlight runner detection
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Example 1:
Input: [1,3,4,2,2]
Output: 2
Example 2:
Input: [3,1,3,4,2] Output: 3
Note:
Approach #1: Using hash table
time(O(N)) space(O(n))
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int len = nums.size();
vector<int> temp(len, 0);
for (int i = 0; i < len; ++i)
if (++temp[nums[i]] == 2) return nums[i];
}
};
Approach #2 Floyd‘s Tortoise and Hare (Cycle Detection)
time(O(n)) space(O(1))
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int tortoise = nums[0];
int hare = nums[0];
// Find the intersection point of the two runner.
do {
tortoise = nums[tortoise];
hare = nums[nums[hare]];
} while (tortoise != hare);
// Find the "entrance" to the cycle
int ptr1 = nums[0];
int ptr2 = tortoise;
while (ptr1 != ptr2) {
ptr1 = nums[ptr1];
ptr2 = nums[ptr2];
}
return ptr1;
}
};
Runtime: 8 ms, faster than 83.02% of C++ online submissions for Find the Duplicate Number.
287. Find the Duplicate Number
标签:complex ESS sub fas and ble highlight runner detection
原文地址:https://www.cnblogs.com/ruruozhenhao/p/9902351.html