數組中重複的數字

在一個長度爲 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;
}
相關文章
相關標籤/搜索