在乙個長度為n+1的陣列中,所有數字都在 1 ~ n的範圍中,所以陣列中至少有乙個數字是重複的。
請找出任意乙個重複的數字,但不能修改輸入的陣列。
例:
[2, 3, 5, 4, 3, 2, 6, 7] 輸出 2 或者 3利用collections.counter統計次數,再遍歷輸出value>1的key。[1, 2, 3, 4, 5, 6, 7, 8] 輸出 none
時間複雜度: counter需要o(n);遍歷o(n);總時間複雜度o(n)
空間複雜度:字典(雜湊表)o(n)
存在重複數k,則必然使陣列中<=m(m>=k)的數個數》k個。根據這個特點,利用二分法查詢k。遍歷陣列將,陣列分為=n//2兩組。在數目超出的組中繼續劃分,直到找到數字維直。
時間複雜度:t(n) = t(n/2) + o(n) = o(n) * log(n) = o(nlogn)
空間複雜度:o(1), 如果將分割的陣列存下來,空間複雜度為o(n),而時間複雜度將降為o(n)
def
duplication_in_array_no_edit
(nums)
:'''
:param nums: list to search
:return: duplicated num
'''import collections
dup_num =
none
count = collections.counter(nums)
for num in count:
if count[num]
>1:
dup_num = num
break
return dup_num
def
duplication_i_array_no_edit2
(nums)
:"""
:param nums: list to search
:return: duplicated num
"""ifnot nums:
return
none
n_min =
1 n_max =
len(nums)-1
while n_min <= n_max:
mid =
(n_min + n_max)//2
count =
0for num in nums:
if num <= mid:
count +=
1if n_min == n_max:
# no duplication check
dup_num = mid if count > mid else
none
break
if count > mid:
n_max = mid
else
: n_min = mid +
1return dup_num
如果要求輸出所有重複數字呢?
空間複雜度和時間複雜度之間需要trade-off
劍指offer03 陣列中重複的數字
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3限制 2 n 100000 首先拿到這道題最先想到的是...
劍指Offer03 陣列中重複的數字
劍指offer典型題整理 爭取做最好的題解 題目描述 在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限...
劍指offer 03陣列中重複的數字
找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 首...