p135 查找重复数字(leetcode 287)
一:解题思路
用快慢指针法来解决这道题,效率是最高的。从下标为0开始,以每次下标开始读数组,肯定会形成一个圆环。此时,用快慢指针从头部开始走,最终快慢指针肯定会相遇在某个地方。此时,再用另外一个指针指向头部,和慢指针一次走一步,最终他们会相遇到圆环的开始节点。
Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
C++:
class Solution { public: int findDuplicate(vector<int>& nums) { int slow = nums[0]; int fast = nums[nums[0]]; while (fast != slow) { slow = nums[slow]; fast = nums[nums[fast]]; } int p = 0; while (p != slow) { slow = nums[slow]; p = nums[p]; } return slow; } };
Java:
class Solution { public int findDuplicate(int[] nums) { int fast=nums[nums[0]]; int slow=nums[0]; while (fast!=slow) { slow=nums[slow]; fast=nums[nums[fast]]; } int p=0; while (p!=slow) { slow=nums[slow]; p=nums[p]; } return slow; } }

浙公网安备 33010602011771号