标签: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