「只出現一次的數字」leetcode刷題|007

「只出現一次的數字」leetcode刷題|007

題目

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

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

輸出: 3

示例 2:

輸入: [0,1,0,1,0,1,99]

輸出: 99

解答

這道題是中等難度的題目,剛開始我一看,哎,這麼簡單,順手就寫了起來

class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ for i in nums: if nums.count(i) == 1: return i

運行一看也正確,沒啥問題,統計數字嘛,以前也遇見過。

可是當我看運行結果我才知道,這道題不是不僅僅是解出來結果就行了。還要考慮時間複雜度。

看一下我的運行結果

可以看到只打敗了10%的提交者,雖然解決了問題,可耗時太長,顯然不是這道題的最好解決方法。

看看大佬的代碼

class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) == 1: return nums[0] a = sorted(nums) for i in range(0,len(nums)-1): if a[i] == a[i-1] or a[i] == a[i+1]: continue else: return a[i] return a[-1]

之所以我的代碼耗時時間長,是因為每次統計都要遍歷一遍列表,大佬的代碼只遍歷了一次。

再看一個

class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ buffer_dict = {x: 0 for x in nums} for x in nums: buffer_dict[x] += 1 for x in buffer_dict.items(): if x[1] == 1: return x[0]

利用字典來做,時間複雜度最小,耗時28ms,目前來說最好的解決方法。


推薦閱讀:

不會英語也能做SWT!你還在大量刷題?掌握技巧15分鐘就能輕鬆得高分!!
10.Regular Expression Matching
關於數學的演算法2 ||LeetCode刷題總結:math
刷題筆記本——1:PAT (Advanced Level) Practice 1001 A+B Format (20)(20 分)
英國男孩已用玩具船環遊世界,我家男孩卻還在吼聲中艱難刷題

TAG:數學 | 刷題 | 演算法 |