1. 題目介紹
《劍指offer》第3題 - 找出數組中重複的數字
在一個長度爲n的數組裏所有的數字都在0~n-1之間, 數組可能存在重複數字, 找出這個數組中重複的數字中的任意一個;
比如輸入長度爲7的數組{2, 3, 1, 0, 2, 5, 3}, 對應重複數字爲2, 3;
1. 利用哈希表是最常見的解法, 但是需要維護一個空間複雜度爲o(n)的哈希表;
2. 利用哈希表解法, 無法用到題中的條件"長度爲n的數組裏所有的數字都在0~n-1之間";
3. 常常需要考慮到數組爲空,數組包含特殊元素等,使程序更魯棒;
2. Python實現
def find_duplicates_num_1(List):
""" 法一
利用哈希表, o(n)時間複雜度, o(n)空間複雜度;
key = 數組中的元素, value = 元素出現的次數;
"""
num_cnt = {}
for num in List:
num_cnt[num] = num_cnt.get(num, 0) + 1
if num_cnt[num] > 1:
return num
return False
def find_duplicates_num_2(List):
""" 法二: o(n)時間複雜度, o(1)空間複雜度 """
# 空串
if len(List) == 0:
raise(Exception("List has no number."))
# List中包含0~n-1之外的數字
if max(List) >= len(List) or min(List) < 0:
raise(Exception("List's number must be in 0~n-1."))
length = len(List)
for i in range(length):
if List[i] < i:
return List[i], i
while i != List[i]:
temp = List[i]
List[i] = List[temp]
List[temp] = temp
return False
if __name__ == "__main__":
result, i = find_duplicates_num_2([])
3. C++實現