【leetcode】268 丢失的数字 刷题攻略

452 阅读1分钟
刻意练习,每日精进。

题目:

image.png 分析: 找到范围N以内没有出现的数字: 要么就是N,要么就是N内,理解他们的区别在于:< 是否小于N,于是顺其自然得到:

  1. N中符合特点的数;
  2. N+1 写出来最直接可能没啥难度的代码:
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        star = max(nums)
        for i in range(star):
            if i not in nums:
                star = i
                return star
        return star+1

提交后确实也能通过,但可以看出效率不是很高,还需要进一步看看

翻过一遍题解,官方解答比较有代表性,提出了:“排序”、“哈希”、“数学”、“位运算”四种方式,数学不那么具有代表性(并不是所有算法题都有对应的数学公式直接求解,可以先过一遍,其他三种依次了解。

  • 数学方式: 使用求和公式,又叫高斯公式,算出N以内的加法,缺了哪个数字,它与其总和差额就是谁,举个栗子:

image.png 拿题目中示例4来算:

image.png N值可以看出为9,那么total=45,nums总和的为37,star(目标数)=total-sum(nums)=8

image.png (随意找个在线运行计算一下) 那么,代码应该是:

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

一开始的写法加了判断,如果为零或者之类的,检查后发现直接返回差值就行了。另一种自己实现加法的话,也可以把内置函数sum改成用total挨个儿去减nums中值,最后返回total也行。