1- 思路
题目识别
- 识别1 :给定一个数组,寻找数组中的重复数。必须用 O(1) 的空间复杂度,且不能修改数组。
快慢指针-类比链表判环
- 使用思路与链表判环类似。
- 如果用 数组的元素作为下标,则会出现环因此使用链表判环的思路。
2- 实现
⭐31. 下一个排列——题解思路
class Solution {public int findDuplicate(int[] nums) {int slow = nums[0];int fast = nums[0];do{slow = nums[slow];fast = nums[nums[fast]];}while(slow!=fast);slow = nums[0];while(slow != fast){slow = nums[slow];fast = nums[fast];}return slow;}
}
3- ACM 实现
public class findDuplicate {public static int findDuplicate(int[] nums){int slow = nums[0];int fast = nums[0];do{slow = nums[slow];fast = nums[nums[fast]];}while(slow!=fast);slow = nums[0];while(slow!=fast){slow = nums[slow];fast = nums[fast];}return slow;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String input = sc.nextLine();input = input.replace("[","").replace("]","");String[] parts = input.split(",");int[] nums = new int[parts.length];for(int i = 0 ; i < nums.length;i++){nums[i] = Integer.parseInt(parts[i]);}System.out.println("结果是"+findDuplicate(nums));}
}