LeetCode #268. Missing Number

题目

268. Missing Number


解题方法

题目要求实现一个时空复杂度分别为O(n)和O(1)的方法,我的思路是采用交换数位的方法,判断过程比较繁琐就不再赘述了。

比较好的办法是用高斯公式,计算n个数的和,再减去数组中数字之和得到返回值。


代码

高斯公式法

class Solution:
    def missingNumber(self, nums):
        expected_sum = len(nums)*(len(nums)+1)//2
        actual_sum = sum(nums)
        return expected_sum - actual_sum

位置交换法

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        i = 0
        n = len(nums)
        ret = n
        
        while i < n:
            if nums[i] != i:
                if nums[i] == n:
                    if i != n - 1 and nums[n-1] != n - 1:
                        nums[i], nums[n-1] = nums[n-1], nums[i]
                    else:
                        ret = i
                        i += 1
                else:
                    if nums[nums[i]] != nums[i]:
                        temp = nums[i]
                        nums[i] = nums[nums[i]]
                        nums[temp] = temp
                    else:
                        ret = i
                        break
            else:
                i += 1
        
        return ret
posted @ 2020-11-02 15:21  老鼠司令  阅读(83)  评论(0)    收藏  举报