題目描述:
在乙個長度為n的陣列裡,所有的數字都在0~n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如陣列,那麼對應的輸出是重複的2或者3。
總體思路
利用題目所給的條件「所有的數字都在0~n-1的範圍內」,我們將陣列裡的數和下標對應起來,即numbers[i]==i,如果陣列中沒有重複的數字,那麼遍歷完陣列後數字i會出現在下標i的位置;如果有就直接返回。
分析
以陣列為例模擬程式步驟。
陣列的第0個數字為2,與下標不等,與下標為2的數字1交換,得到
接著,第0個數字1還是與下標0不等,再與下標1的數字3交換,得到
還是,第0個數字3與下標0不等,與下標3的數字0交換,得到
現在陣列裡的0,1,2,3分別都和下標對應,陣列遍歷來到了下標為4的數字2這裡,由於數字與下標不對應,我們想把這個2交換到下標為2的位置中,卻發現當前的2已經與下標為2的數字2相等了,這時候我們就找到了乙個重複的數字了。直接返回。
實現**
#include
using
namespace std;
bool
duplicate
(int numbers,
int length)
for(
int i=
0;ifor(
int i=
0;i)//交換兩數numbers[i]和numbers[numbers[i]]
int temp=numbers[i]
; numbers[i]
=numbers[temp]
; numbers[temp]
=temp;}}
return
false;}
intmain()
;int length=
sizeof
(a)/
sizeof
(a[0])
;//求陣列長度 if(
duplicate
(a,length)
)return0;
}
複雜度
時間複雜度,雖然有兩重迴圈,但是內迴圈裡,每個數字最多只要交換兩次就能找到屬於它的位置,因此總時間複雜度為o(n)
沒有使用額外的空間,因此時間複雜度為o(1)
純粹記錄演算法,歡迎指正!!!
i am just a hamal of code!!!
陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 python 實現 an highlighted block ...
陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個 數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。include iostream using namespace ...
陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。思路 用雜湊表解決的時間複雜度和空間複雜度為o n 因為陣列中...