劍指offer-1.數字中重複的數字

劍指offer-1.數字中重複的數字

題目描述:
在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。

Input:
{2, 3, 1, 0, 2, 5}
Output:
2

解題思路:
數組元素在 [0, n-1] 範圍內的問題,可以將值爲 i 的元素調整到第 i 個位置上進行求解,即位置序號與值進行對應,若位置序號與值位對應,則進行調整,直到第一個出現重複的數字
以 (2, 3, 1, 0, 2, 5) 爲例,第一個元素的值位2.則應將其與2號位置上的元素1進行調換,此時數組爲(1,3,2,0,2,5),調整後數組第一個元素值爲1(仍然不滿足第一個元素值爲0),故再將其與位置序號爲1上元素進行調換,此時數組爲(3,1,2,0,2,5),依次,再將第一個元素與位置序號爲3的元素進行調換,此時數組又變爲(0,1,2,3,2,5),此時數組前面四個元素滿足值爲i其位置序號也爲i的對應關係,位置序號爲5的元素值爲2與位置序號爲2的元素值爲2是重複的,此時即可輸出重複的數字爲2

圖示:
在這裏插入圖片描述

public bool duplicate(int[] nums, int length, int[] duplication) {
    if (nums == null || length <= 0)
        return false;
    for (int i = 0; i < length; i++) {
        while (nums[i] != i) {
            if (nums[i] == nums[nums[i]]) {
                duplication[0] = nums[i];
                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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章