More:【目錄】LeetCode Java實現html
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.java
Example 1:node
Input: Output: 2 [1,3,4,2,2]
Example 2:less
Input: [3,1,3,4,2] Output: 3
Note:post
we can regard the array as a linked list: treat the index as a node, treat the value as a next pointer. For example: (array =>linked List)ui
↓↓this
So we can transform this problem into a Linked List Cycle problem, refer to Linked List Cycle II for more details.spa
public int findDuplicate(int[] nums) { if(nums==null) return -1; //invalid int fast=0; int slow=0; do{ fast=nums[nums[fast]]; slow=nums[slow]; }while(fast!=slow); int entry=0; while(entry!=slow){ entry=nums[entry]; slow=nums[slow]; } return entry; }
Time complexity : O(n)
code
Space complexity : O(1)
orm
there is a cycle in the list, becasue:
1. Two different indexes have the same value, which means two different nodes point to the same node.
2. node0 (index=0) will absolutely point to another node.
More:【目錄】LeetCode Java實現