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

2021-09-03 07:44:30 字數 1523 閱讀 3128

在乙個長度為n的陣列裡中所有數字都在0 ~ n-1的範圍內。請找出陣列中任意乙個重複的數字。

例:

[2, 3, 1, 0, 2, 5, 3] 輸出 2 或者 3

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

排序陣列後遍歷,如果出現連續2個相同的數字,即返回該數字。否則遍歷完成後返回none。

時間複雜度:排序操作需要o(nlogn);遍歷比較需要o(n); 總時間複雜度o(nlgon)

空間複雜度:o(1)

用collections.counter統計列表中所有元素出現的次數。遍歷字典,有》=1次的即返回。

時間複雜度:counter需要o(n);遍歷o(n);總時間複雜度o(n)

空間複雜度:字典(雜湊表)o(n)

手動統計出現次數存入乙個字典,遍歷陣列過程中發現字典中已存在鍵值時,即返回。

時間複雜度:最差情況同上,但存在重複數時可以提前結束遍歷。o(n)

空間複雜度:同上

觀察題目需求,1)不需要輸出所有重複數 2)陣列中數字範圍等於陣列下標。因此可以做特殊的處理。

將陣列的下標作為雜湊表的鍵,陣列內容作為值,構建乙個雜湊表。遍歷陣列將數字按雜湊表的方式存入。遍歷陣列,當出現衝突時即存在重複數。

從另乙個角度看,其實相當於乙個排序,對於輸入有規定範圍的不重複的n個元素的排序,將他們存入到乙個最大元素值的大小的陣列中,使得 n[i] = i。

時間複雜度:遍歷比較o(n),交換o(n);總時間複雜度o(n)

空間複雜度:如果採取交換的方式,空間複雜度將是o(1),新建陣列的話,空間複雜度將是o(n)

思路4:時間複雜度o(n),空間複雜度o(1)

def duplication_in_array(nums):

''':param nums: list to check

:return: duplicated num or none

'''dup_num = none

for i, num in enumerate(nums):

if num < 0 or num > len(nums) - 1:

# boundary

dup_num = num

break

while num != i:

# hash func: i(key) = num(value)

if nums[num] == num:

# collision

dup_num = num

break

else:

# swap -> store num in hash way

nums[num], nums[i] = num, nums[num]

return dup_num

如果要求輸出全部重複數字。

不提前中止迴圈

衝突數存入乙個列表返回

如果輸入陣列中數字的範圍沒有限定,甚至不是數字。

新建字典(雜湊表)即可解決,只是空間複雜度變成o(n) 

劍指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 首...