找陣列中的重複數字

2021-09-13 02:18:28 字數 1454 閱讀 7661

題目描述:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至

少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。

演算法思路

#include

intgetduplicate

(const

int* numbers,

int length)

int start =1;

int end = length -1;

while

(end >= start)

else}if

(count >

(middle - start +1)

)else

}return-1

;}

計算陣列中在給定區間的元素個數

int

countrange

(const

int* numbers,

int length,

int start,

int end)

int count =0;

for(

int i =

0; i < length; i++)}

return count;

}

思路:由於長度為n的空間中的元素都在1-n-1之間,因此乙個蘿蔔乙個坑.如果陣列中沒有重複的數字,則第i位置應該放置的數字為i。可以重排此陣列,讓對應位置上的數字對應。

int

duplicate

(int

*arr,

int len)

for(

int i=

0;i++i)

//檢查輸入陣列的合法性

}for

(int i=

0;i++i)

int tmp=arr[i]

; arr[i]

=arr[tmp]

; arr[tmp]

=tmp;}}

return-1

;}

以下幾種方法空間複雜讀或者時間複雜度都優點高,就不進行**展示,讀者可以通過閱讀思路,簡單了解一下。o(∩_∩)o

思路:從頭到尾順序掃瞄陣列中的每乙個數,每掃瞄乙個數字可以用o(1)的時間在雜湊表中判斷是否包含此數字,如果雜湊表中沒有此數字就將此數字加入到雜湊表中,如果雜湊表中已存在此數字就找到了重複的數字。時間複雜度為o(n),但是空間複雜度也為o(n),以空間換區時間。

思路:將輸入的陣列進行排序,遍歷排序後的陣列找到重複的數字(該元素和其下乙個元素相等就代表該元素是重複元素)。排序乙個長度為n的數字的時間複雜度為o(nlogn),所以這種方法的時間複雜度為o(nlogn)。

陣列中重複數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回...

陣列中的重複數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。1 排序 將陣列排序,然後掃瞄排序後的陣列即可。時間複雜度 o nl...

陣列中的重複數字

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