刻意练习,每日精进。
题目:
分析:
找到范围N以内没有出现的数字:
要么就是N,要么就是N内,理解他们的区别在于:
< 是否小于N,于是顺其自然得到:
- N中符合特点的数;
- 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以内的加法,缺了哪个数字,它与其总和差额就是谁,举个栗子:
拿题目中示例4来算:
N值可以看出为9,那么total=45,nums总和的为37,star(目标数)=total-sum(nums)=8
(随意找个在线运行计算一下)
那么,代码应该是:
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也行。