【LeetCode 簡單題】70-缺失數字
宣告:
今天是第70道題。給定一個包含 0, 1, 2, ..., n
中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:給定一個包含 0, 1, 2, ..., n
中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。
示例 1:
輸入: [3,0,1] 輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8
說明:
你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?
解法1。線性時間。先對nums排序,再使用列舉enumerate方法,如果key和value不相等代表缺失了與key相等的數字,程式碼如下。
執行用時: 52 ms, 在Missing Number的Python提交中擊敗了35.62% 的使用者
class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ # 長度為1時只可能有2種情況,就是為1或者0 if len(nums)==1: if nums[0]==0: return 1 if nums[0]==1: return 0 nums.sort() for key,val in enumerate(nums): if key != val: return key else: continue return nums[-1]+1 # 如果當前序列不缺元素,則返回最後1個元素加1
解法2。如果缺失的數字出現在中間,那麼可以利用等差數列的求和公式求出它完整時的和,再減去實際的和就是缺失的那個數字,程式碼如下。
執行用時: 32 ms, 在Missing Number的Python提交中擊敗了99.08% 的使用者
class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ nums_sum = sum(nums) supposed_sum = len(nums)*(len(sum)+1)/2 return supposed_sum-nums_sum
解法3。這種方法真的精妙,如果nums一開始是無序的且肯定缺了1個數,那麼假設這個數是i,放在index為len(nums)這個位置上,也就是最後1個,那麼就構成了1個完整的序列,該完整序列的值和index都異或,得出結果肯定為0,套用下面的異或法則,因為完整的index和value一定相等嘛,現在把i單獨抽出來,[3,1,0,i]全員異或的公式就變為:3⊕0⊕1⊕1⊕0⊕2⊕i⊕len(nums)=3⊕0⊕1⊕1⊕0⊕2⊕len(nums)⊕i=0,i=3⊕0⊕1⊕1⊕0⊕2⊕len(nums),程式碼實現如下。
- a^b=1
- a^a=0
- a^b^a=b
執行用時: 40 ms, 在Missing Number的Python提交中擊敗了64.38% 的使用者
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i_index = len(nums)
for i in range(len(nums)):
i_index ^= (i^nums[i])
return i_index
解法4。用set這個資料結構,根據給定的序列,構造一個對應的完整的序列,再找2者的不同元素,pop出來正好有現成的API,程式碼如下。
執行用時: 40 ms, 在Missing Number的Python提交中擊敗了64.38% 的使用者
- set(a).difference(b):返回的是集合a、b的不同元素構成的集合
- .pop():就是把返回的集合元素彈出,這裡面只有1個元素,就是缺失的那個元素
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return set(range(len(nums)+1)).difference(set(nums)).pop()
結尾
解法1:https://blog.csdn.net/qq_34364995/article/details/80699747
解法2&解法3:https://blog.csdn.net/u014251967/article/details/52473505
解法4:LeetCode