无导入依赖优化Python统计子串和为目标值代码的超时问题
问题分析
你现有代码的核心问题是性能不足:
- 时间复杂度为O(n²):每次迭代都要遍历数组计算新的子数组和,同时调用
count方法遍历统计目标值出现次数,当序列长度达到10000时,总操作量接近1亿次,必然会触发超时。 - 存在大量重复计算:不同长度的连续子串和的计算没有复用历史结果,造成了无意义的性能损耗。
优化方案
采用前缀和+哈希计数的思路,将时间复杂度降到O(n),核心逻辑如下:
- 定义前缀和
pre_sum,表示从数组第一个元素到当前遍历元素的累加和 - 任意连续子串
[j+1, i]的和等于pre_sum[i] - pre_sum[j],我们需要这个值等于目标subtotal,推导可得pre_sum[j] = pre_sum[i] - subtotal - 用字典记录每个前缀和出现的次数,遍历过程中直接查询
pre_sum[i] - subtotal的出现次数,累加到最终结果即可
优化后代码
def ex1(int_seq, subtotal): list_numbers = list(map(int, int_seq.split(","))) pre_sum_count = {0: 1} # 初始前缀和0出现1次,对应从第一个元素开始的子串场景 pre_sum = 0 res = 0 for num in list_numbers: pre_sum += num # 查找符合要求的前缀和出现次数,累加结果 res += pre_sum_count.get(pre_sum - subtotal, 0) # 更新当前前缀和的计数 pre_sum_count[pre_sum] = pre_sum_count.get(pre_sum, 0) + 1 return res
效果验证
用你提供的测试用例验证:
输入int_seq='3,0,4,0,3,1,0,1,0,1,0,0,5,0,4,2',subtotal=9,运行代码输出结果为7,和预期完全一致。
针对10000个1组成的超长序列,该代码运行时间可稳定控制在毫秒级,完全满足1秒的时间限制要求。
内容的提问来源于stack exchange,提问作者dav00
相关产品推荐
相关产品推荐

