leetcode260 只出現一次的數字 III

2021-09-27 12:34:35 字數 1435 閱讀 1661

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例:

輸入: [1,2,1,3,2,5]

輸出: [3,5]

注意:

結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。

你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

解法一:

簡單暴力的解法,用字典來統計陣列中數字出現的次數,然後返回,簡單快速,速度擊敗了98.83%。

class

solution

(object):

defsinglenumber

(self, nums)

:"""

:type nums: list[int]

:rtype: list[int]

"""dict

= re =

for i in nums:

if i in

dict

:dict

[i]+=

1else

:dict

[i]=

1for key in

dict:if

dict

[key]==1

:return re

解法二

採用基礎題目中(136)的位運演算法,回顧一下,乙個數與0異或還是自己,與自己異或等於0,所以本題有2個單獨出現的數字,其他數字都出現2次,所以整個陣列異或的結果應該就是這兩個數字的異或結果。

我們思考怎麼把這個問題分解成基礎問題,如果把兩個單獨出現的數字分別放到兩個組中,就分解成了兩個基礎問題,那麼怎麼分呢。

兩個數字異或的結果中,一定有一位為1,我們可以通過這一位是不是1來進行分類,分成兩組,這樣就可以保證分成兩組,且每一組只有1個單獨出現的數字,再採用基礎問題中的方法就可以解決了。

class

solution

(object):

defsinglenumber

(self, nums)

:"""

:type nums: list[int]

:rtype: list[int]

"""xor =

0for num in nums:

xor ^

= num

mask =

1while xor & mask ==0:

mask <<=1

a, b =0,

0for num in nums:

if mask & num ==0:

a ^= num

else

: b ^

= num

return

[a, b]

LeetCode260 只出現一次的數字 III

給定乙個整數陣列nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。找出只出現一次的那兩個元素。示例 輸入 1,2,1,3,2,5 輸出 3,5 注意 結果輸出的順序並不重要,對於上面的例子,5,3 也是正確答案。你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?方法呢...

leetcode260 只出現一次的數字 III

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。找出只出現一次的那兩個元素。示例 輸入 1,2,1,3,2,5 輸出 3,5 注意 結果輸出的順序並不重要,對於上面的例子,5,3 也是正確答案。你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?le...

leetcode260 只出現一次的數字 III

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。找出只出現一次的那兩個元素。示例 輸入 1,2,1,3,2,5 輸出 3,5 class solution a,b是答案要求的兩個數 bitmask a b int diff bitmask bitmask diff中...