題目描述:在乙個長度為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之間,如果沒有該陣列中沒有重複的數...