劍指Offer03 陣列中重複的數字

2021-10-02 22:45:26 字數 2470 閱讀 1646

劍指offer典型題整理 - 爭取做最好的題解

題目描述

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。
示例

輸入:

[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3

限制:

2 <= n <= 100000
題解這道題做起來,但是作為乙個面試題,他有很多可以深挖的知識點:

? 解法1:hash

由於n個數字均在[0, n-1],而且n的最大值為100000,因此可以申請乙個大小為100001的陣列並全部初始化為0,逐個將nums中的數字新增到對應的位置,如果在某個位置的計數值大於1直接返回即可。這個方法的缺點是比較佔空間,空間複雜度o(n)。

python版本

class

solution

(object):

deffindrepeatnumber

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""dp =[0

for i in

range

(len

(nums))]

for num in nums:

if dp[num]==1

:return num

dp[num]+=1

return

-1

? 解法2:排序後從前往後查詢是否存在重複

時間複雜度o(nlogn),空間複雜度o(1)

python版本

class

solution

(object):

deffindrepeatnumber

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""nums.sort(

)for i in

range(1

,len

(nums)):

if nums[i]

==nums[i-1]

:return nums[i]

? 解法3:桶排序+抽屜原理

桌上有十個蘋果,要把這十個蘋果放到九個抽屜裡,無論怎樣放,我們會發現至少會有乙個抽屜裡面放不少於兩個蘋果。這一現象就是我們所說的「抽屜原理」。

這個方法是解法1的進一步優化,解法1申請了乙個等大的空間用於儲存hash,那麼能不能在nums陣列的基礎上直接進行對映?可以通過將陣列中的每乙個數字對映到對應的陣列下標下面實現!這裡利用到了抽屜原理:乙個陣列下標只能對應乙個數字,如果對應兩個及以上數字則說明當前下標對應的數字重複了。

使用抽屜原理和桶排序的思想,可以在o(1)的空間複雜度內完成這道題目。

python版本

class

solution

(object):

deffindrepeatnumber

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""for i in

range

(len

(nums)):

while nums[i]

!= i:

if nums[i]

== nums[nums[i]]:

return nums[i]

nums[nums[i]

], nums[i]

= nums[i]

, nums[nums[i]

]return

-1

c++版本

(完)

劍指offer03 陣列中重複的數字

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3限制 2 n 100000 首先拿到這道題最先想到的是...

劍指offer 03陣列中重複的數字

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 首...

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

題目連線 找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。輸入 2,3,1,0,2,5,3 輸出 2 或 3 初次思考 題目給了陣列的數的範...