劍指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;
}