数学是最好的算法
今天刷 leetcode 每日一题,题面如下:给你一个整数 n ,请你计算以下两个值的最大公约数( GCD ): sumOdd :最小的 n 个正奇数的总和; sumEven :最小的 n 个正偶数的总和;返回 sumOdd 和 sumEven 的 GCD 。
给大伙看看用辗转相除法怎么做。
1 | class Solution { |
事实上,要是用上 <numeric> 库里自带的 gcd 函数,这道题将会更简单。但是今天分享的重点不在这里,让我们关注一下最后一条语句。学过高中数学的都知道,这是由等差数列求和公式算出来的奇数和和偶数和。具体公式如下:
那么问题来了,我们并不需要拉马努金那样的注意力也能发现,这两个结果里面,是不是都有个 n 呢。所以有一个时间和空间复杂度都是 O(1) 的解法如下:
1 | class Solution { |
数学是最好的算法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 SpeechlessPanda!
评论

