当前位置:网站首页>leetcode-829. 连续整数求和(数论)
leetcode-829. 连续整数求和(数论)
2022-07-31 05:10:00 【lin钟一】
题目链接:https://leetcode.cn/problems/consecutive-numbers-sum/
思路
方法:数论
直接想法
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
题目给定范围是109
方法一:用枚举i和k 需要O(n2) 肯定超时
方法二:枚举i 和 二分k 需要O(n * logn) 也肯定超时
只能控制时间复杂度在O(n)的时间
所以我们需要用更好的方法求出答案,我们推导等差数列求和公式可以发现
2n = a * b,我们只需要枚举 2n的因子,再通过2i = a - (b - 1)是否满足 2i 为偶数且大于零即可找出答案,但是这样还不够,2n最差时间复杂度需要2 * 10 9 依旧会超时。
我们可以只枚举a, b用n/a代替判断,只需要循环枚举2n的平方根
代码示例
func check(a, b int) bool{
i2 := a - (b - 1)
if i2 & 1 == 1{
return false
}
if i2 <= 0{
return false
}
return true
}
func consecutiveNumbersSum(n int) (ans int) {
n *= 2
sq := int(math.Sqrt(float64(n)))
for i := 1; i <= sq; i++{
if n % i == 0{
if check(i, n / i){
ans++
}
if i != n / i{
if check(n / i, i){
ans++
}
}
}
}
return
}
复杂度分析
- 时间复杂度:O(sqrt(2 * n)) 我们只需要循环枚举根号2n,找出他的所有因子即可
- 空间复杂度:O(1) 不需要额外申请空间
边栏推荐
猜你喜欢
uni-app进阶之内嵌应用【day14】
【mysql 提高查询效率】Mysql 数据库查询好慢问题解决
The interviewer asked me how to divide the database and the table?Fortunately, I summed up a set of eight-part essays
[MQ I can speak for an hour]
MySQL-Explain详解
【C语言趣味小游戏——猜数字】
uni-app进阶之模版语法与数据绑定【day7】
【C语言3个基本结构详解——顺序、选择、循环】
Linux系统安装mysql(rpm方式安装)
Sword Point Offer Special Assault Edition ---- Day 1
随机推荐
let和const命令
Interview Redis High Reliability | Master-Slave Mode, Sentinel Mode, Cluster Cluster Mode
Kubernetes 证书可用年限修改
12 【nextTick 过渡与动画】
数据库上机实验3 连接查询和分组查询
Refinement of the four major collection frameworks: Summary of List core knowledge
10 【组件编码流程 组件自定义事件 全局事件总线】
【一起学Rust】Rust学习前准备——注释和格式化输出
MySQL-如何分库分表?一看就懂
分布式事务处理方案大 PK!
mysql5.7.35安装配置教程【超级详细安装教程】
基于web3.0使用钱包Metamask的三方登陆
对递归的一些感悟
uni-app进阶之认证【day12】
账号或密码多次输入错误,进行账号封禁
Flask 的初识
三子棋讲解(C语言)
字符串的扩展
剑指offer基础版 ---- 第29天
Swordsman Offer Special Assault Edition --- Day 3