在一个长度为 n 的数组里的全部数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每一个数字重复几回。请找出数组中任意一个重复的数字。java
Input: {2, 3, 1, 0, 2, 5} Output: 2
要求时间复杂度是 O(N),空间复杂度是O(1),所以就不能使用排序、额外的标记数组。数组
对数组元素在 [0,n-1]问题,能够将值为 i 的元素调整到第 i 个位置上进行求解。 code
1. 把当前序列当成是一个下标和下标对应值是相同的数组;blog
2. 遍历数组,判断当前位的值和下标是否相等:排序
2.1. 若相等,则遍历下一位;io
2.2. 若不等,则将当前位置 i 上的元素和 a[ i ] 位置上的元素比较:若它们相等,则成功! 若不等,则将它们两交换。换完以后 a[ i ] 位置上的值和它的下标是对应的,但 i 位置上的元素和下标并不必定对应;重复2.2的操做,直到当前位置 i 的值也为 i,将 i 向后移一位,再重复2.class
public boolean duplicate(int[] nums, int length, int[] duplication) { if (nums == null || length <= 0) //判空 return false; for (int i = 0; i < length; i++) { 从 0 遍历 while (nums[i] != i) { if (nums[i] == nums[nums[i]]) { duplication[0] = nums[i]; //duplication[0],存放重复数的 return true; } swap(nums, i, nums[i]); } } return false; } private void swap(int[] nums, int i, int j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; }