题目链接Missing Number

思路
方法1: 排序
我们很自然的可以想到,如果数组是排好序的,那么可以很容易的找到缺少的数字。
之后我们可以查看头尾两个数字是否符合要求。如果不符合我们可以直接返回结果。
最后,我们查从1到n-1个数字。

方法2: Bit Manipulation
利用“XOR”的特点。比如 1 XOR 1 = 0,但1 XOR 1 XOR 2 = 2。
所以只要把数组中的数字和数组中的index全部XOR,那么缺少的那个肯定是我们需要的数字。

方法3: HashSet
放数组的数字放到HashSet里面,然后遍历这个HashSet。如果数字不在就说明这是我们要找的数字。

方法4: 求和
根据高斯定理,从1到n的和为 ((1+n) * n)/2。
所以把数组的所有数字求和,然后与从1到n的和相减所得数字,就是我们需要的数字。

时间复杂度
方法1:

时间:O(nlogn) 
空间:O(1) if we sort the numbers in place

方法2:

时间:O(n)
空间:O(1)

方法3:

时间:O(n)
空间:O(n)

方法4:

时间:O(n)
空间:O(1)

代码

方法1:

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        if nums[0] != 0:
            return 0
        if nums[-1] != len(nums):
            return len(nums)
        
        for i in range(1, len(nums)):
            exp_val = nums[i-1] + 1
            if nums[i] != exp_val:
                return exp_val

方法2:

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = len(nums)
        for i, num in enumerate(nums):
            res ^= i ^ num
        return res

方法3:

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums = set(nums)
        n = len(nums) + 1
        for i in range(n):
            if i not in nums:
                return i

方法4:

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

xuhang57
17 声望0 粉丝

下一篇 »
292. Nim Game