1. 程式人生 > >Leetcode 268:缺失數字(最詳細的解法!!!)

Leetcode 268:缺失數字(最詳細的解法!!!)

給定一個包含 0, 1, 2, ..., nn 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。

示例 1:

輸入: [3,0,1]
輸出: 2

示例 2:

輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

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

解題思路

我們首先想到的方法是建立一個數組,然後將所以元素放進去,然後遍歷陣列看那個數不在即可,例如

nums: 3  0  1
0  1  2  3
1  1  0  1

但是題目要求我們不適用額外的空間,所以我們這個方案就不能使用了。我們還可以怎麼做呢?我們可以將所以數加起來得到一個缺失一個數字的和

,如果我們不缺任何數字的話,所有陣列的和應該是 ( 1 + n ) n / 2 (1+n)n/2
。所以根據二者之差就可以得到結果

class Solution:
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        return n*(n+1)// 2 - sum(nums)

還有一種做法是使用xor,我們知道a^b^b=a,類似於消除遊戲的感覺O(∩_∩)O~。所以我們對於nums中的所有數都做這種操作,最後剩下的沒有消除的元素就是我們缺失的。

class Solution:
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        result = len(nums)
        for i in range(len(nums)):
            result = result^i^nums[i]

        return result

reference:

https://leetcode.com/problems/missing-number/discuss/69832/1+-lines-Ruby-Python-Java-C++

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!