leetcode-829. 连续整数求和(数论)

简介: 这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值

9dbe2ba61aef49c4944b5b718e97744a.png


题目链接: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)的时间


所以我们需要用更好的方法求出答案,我们推导等差数列求和公式可以发现


6dc1ec10fd46420d9a7c16ad1e55eaca.jpg


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
}

1af73dbd58014ad9b2df1fce4f0774d7.png


复杂度分析


  • 时间复杂度:O(sqrt(2 * n)) 我们只需要循环枚举根号2n,找出他的所有因子即可
  • 空间复杂度:O(1) 不需要额外申请空间
目录
相关文章
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
153 1
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
354 2
【LeetCode】整数翻转
【LeetCode】整数翻转
84 1
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
118 0
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
190 0
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
173 0
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
LeetCode第7题整数反转
该文章介绍了 LeetCode 第 7 题整数反转的解法,通过除 10 取模和乘 10 累加的方式实现整数反转,同时注意边界情况的判断,并总结了通过举例推算发现规律的解题思路。
LeetCode第7题整数反转
LeetCode第13题目罗马数字转整数
该文章介绍了 LeetCode 第 13 题罗马数字转整数的解法,通过从大到小解析罗马数字,根据罗马数字的特点,按照从大到小的顺序匹配罗马数字和整数的关系,从而解决该问题,同时强调要注意观察题目考查的知识点特征。

热门文章

最新文章