// 若是[1,n]的數字都只有一個,那麼咱們會造成一個閉合的環。 idx 1 2 3 4 val 3 1 4 2 1->3->4->2 這樣就是一個閉合的環。 若是有重複數字出現的話,以下: idx 1 2 3 4 5 val 2 4 2 3 1 1->2->4->3->2->4 這裏就有一個2->4->3->2的環, 2就是重複數字 public class Solution { public int findDuplicate(int[] nums) { int slow = nums[0]; int fast = nums[nums[0]]; while(slow != fast){ slow = nums[slow]; fast = nums[nums[fast]]; } fast = 0; while(slow != fast){ slow = nums[slow]; fast = nums[fast]; } return fast; } }
若是1到mid每一個數字都只出現一次,在nums裏<=mid的個數應該就是mid. 個數大於mid的話,前面的數字裏就會有重複。 public class Solution { public int findDuplicate(int[] nums) { int n = nums.length-1, lo = 1, hi = n; while(lo < hi){ int mid = lo + (hi-lo)/2, count = 0; for(int n: nums) if(n <= mid) count++; if(count > mid) hi = mid; else low = mid+1; } return lo; } }