劍指Offer 03 陣列中重複的數 2

2021-09-03 08:04:20 字數 1594 閱讀 5894

在乙個長度為n+1的陣列中,所有數字都在 1 ~ n的範圍中,所以陣列中至少有乙個數字是重複的。

請找出任意乙個重複的數字,但不能修改輸入的陣列。

例:

[2, 3, 5, 4, 3, 2, 6, 7] 輸出 2 或者 3

[1, 2, 3, 4, 5, 6, 7, 8] 輸出 none

利用collections.counter統計次數,再遍歷輸出value>1的key。

時間複雜度: 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 首...