Leetcode 268:缺失数字(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/83855671

给定一个包含 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

扫描二维码关注公众号,回复: 3991696 查看本文章

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/83855671