如何用Python解决创建指定长度和目标和的子数组问题
问题分析与解决方案
你的代码和预期输出存在明显矛盾:当前代码是在查找连续的长度为k的子数组,但示例输入对应的预期输出[1,4,5]是数组中不连续的三个元素(和为10)。下面分两种需求场景给出对应解决方案:
场景1:查找连续的长度为k的子数组
你的原代码采用滑动窗口思路,逻辑本身是正确的,但针对给定的示例输入arr = [1,2,3,6,4,9,5]、k=3、target=10,不存在连续的长度为3的子数组和为10,因此原代码运行结果为[]。
如果需求确实是连续子数组,可以优化代码(避免每次重复求和,提升效率):
arr = [1,2,3,6,4,9,5] k = 3 target = 10 result = [] # 计算初始窗口的和 current_sum = sum(arr[:k]) if current_sum == target: result.append(arr[:k].copy()) # 滑动窗口遍历剩余元素 for i in range(k, len(arr)): current_sum = current_sum - arr[i - k] + arr[i] if current_sum == target: result.append(arr[i - k + 1 : i + 1]) print(result)
运行后输出[],符合实际情况。
场景2:查找任意(不连续)长度为k的子序列,元素和为target
如果你的真实需求是找出数组中任意k个不连续元素,使其和等于target,那么需要枚举所有长度为k的元素组合,代码如下:
from itertools import combinations arr = [1,2,3,6,4,9,5] k = 3 target = 10 result = [] # 枚举所有长度为k的元素组合 for combo in combinations(arr, k): if sum(combo) == target: result.append(list(combo)) print(result)
运行这段代码,输出为[[1,4,5]],与你的预期输出一致。
原代码问题说明
原代码的滑动窗口逻辑仅适用于连续子数组的查找,若需求是不连续子序列,该思路完全不适用,需要改用组合枚举的方式实现。
内容的提问来源于stack exchange,提问作者6004 Abdul Rahman Harris
相关产品推荐
相关产品推荐

