劍指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 初次思考 題目給了陣列的數的範...