leetcode 287. Find the Duplicate Number(二分/快慢指標)
阿新 • • 發佈:2018-12-17
1.二分方法
因為數字是1~n,所以我們可以根據小於mid的數目來判斷重複的數字是在左邊還是右邊
class Solution { public: int findDuplicate(vector<int>& nums) { int left = 1,right = nums.size()-1; while(left <= right){ int mid = (left+right) >> 1; int cnt = 0; for(int x : nums) if(x <= mid) cnt++; if(cnt > mid) right = mid-1; else left = mid+1; } return left; } };
2.快慢指標
類似於142. Linked List Cycle II
class Solution { public: int findDuplicate(vector<int>& nums) { int fast = 0, slow = 0; while(true){ fast = nums[nums[fast]]; slow = nums[slow]; if(fast == slow){ fast = 0; while(fast != slow){ fast = nums[fast]; slow = nums[slow]; } return slow; } } return 0; } };