劍指offer 陣列中重複的數字

2021-09-19 06:35:51 字數 776 閱讀 8111

在乙個長度為n的陣列裡的所有數字都在0·n-1之間。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼輸出的是重複的數字2或者3.

先排序,從排序的陣列中找出重複的數字。排序乙個長度為n的陣列需要o(nlogn)的時間。

利用雜湊表處理,從頭到尾掃瞄,每次掃瞄時判斷雜湊表中是否存在該數字。時間複雜度是o(n),空間複雜度是o(n).

根據陣列的數字範圍可知,如果沒有重複數字,陣列排序之後數字i將出現在下標為i的位置上。所以我們可以根據這一特性去判斷,從頭到尾掃瞄陣列,掃瞄到下標為i的數字時,判斷這個數字(用m表示)是不是等於i.如果是,則繼續掃瞄;如果不是則判斷第m個數字是否相等。如果相等則找到了重複數字(該數字在下標為i和m的位置都出現了);如果不相等則交換第i個數字和第m個數字,掃瞄繼續。每個數字只需要最多兩次交換就能找到合適的位置。時間複雜度為o(n),空間複雜度為o(1).(上**)

public static int duplicate(int arr)

int n = arr.length;

//判斷數字是否合法

for (int i = 0;i < n;i++)

}for (int i = 0;i < n;i++)

int t = arr[i];

arr[i] = arr[t];

arr[t] = t;}}

return -1;

}

劍指offer 陣列中重複的數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。class solution 考慮這種非法輸入 for i...

劍指offer 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。分析 雖然也ac了,但是沒仔細看題,可以利用題目已有條件做到更簡單的...

劍指offer 陣列中重複的數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。解析 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍...