在一個長度爲 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; }