You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找1到n序列平衡点k:现有Python实现的正确性与优化问询

寻找1到n序列中满足左右和相等的k值

给定1到n的序列,寻找数字k,使得1到k−1的和等于k+1到n的和。例如n=8时,k=6,因为1+2+3+4+5=15,7+8=15。

你的代码问题分析

你当前的代码逻辑存在根本性错误:

  • left_sum 累加的是1到k的和,而题目需要的是1到k−1的和
  • right_sum 的计算逻辑错误,它累加的是从n开始往前的k个数(比如k=5时,加的是8、7、6、5、4),但实际需要的是k+1到n的和
  • 条件判断中的right_numbers[-1] - left_numbers[-1] == 2属于冗余且逻辑不严谨的判断,仅在n=8的测试用例中碰巧得到正确结果

数学推导(最优解思路)

设序列总和为 S = n*(n+1)/2,根据题意:
1到k−1的和 = k+1到n的和
即:(k-1)*k/2 = S - k - (k-1)*k/2
整理等式可得:k² = n(n+1)/2

结论:

  • 只有当n(n+1)/2是完全平方数时,才存在符合条件的k,此时k等于该平方数的平方根
  • 否则不存在这样的k,返回-1

正确的实现方式

方法1:数学法(最优,时间复杂度O(1))

import math

def find_k(n):
    total = n * (n + 1) // 2
    k = math.isqrt(total)
    if k * k == total:
        return k
    return -1

# 测试用例
print(find_k(8))  # 输出6,正确
print(find_k(49)) # 输出35,正确
print(find_k(15)) # 输出-1,正确

方法2:暴力遍历(时间复杂度O(n))

如果想保留遍历思路,正确逻辑应该是基于总和动态维护左右侧和:

def find_k(n):
    total = n * (n + 1) // 2
    left_sum = 0
    for k in range(1, n+1):
        right_sum = total - left_sum - k
        if left_sum == right_sum:
            return k
        left_sum += k
    return -1

# 测试用例
print(find_k(8))  # 输出6,正确

总结

  • 数学法是最优解,直接通过公式判断是否存在k并计算,无需遍历
  • 你的原代码逻辑错误,虽然测试用例碰巧得到正确结果,但无法处理其他有效场景(比如n=49时会错误返回)

内容的提问来源于stack exchange,提问作者GratefullyDead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:12:11