寻找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
相关产品推荐
相关产品推荐

