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

如何在n个数组中查找元素组合使其和等于给定值X?

任意数量数组求和为目标值的通用实现

你原来写的多层嵌套循环逻辑本质是遍历所有数组的笛卡尔积,只要把「固定层数的嵌套遍历」换成「支持任意输入数量的笛卡尔积生成逻辑」,就能适配任意n个数组的场景。下面给两种可直接用的实现:


方案1:直接遍历笛卡尔积(逻辑和原硬编码完全一致)

Python标准库的itertools.product本身就支持接收任意数量的可迭代对象,自动生成所有跨列表的元素组合,效果和手写n层for循环完全等价,不需要硬编码循环层数。

from itertools import product

def find_target_combinations(arrays: list[list[int]], target_sum: int):
    valid_combos = []
    # *arrays会把传入的列表拆成独立参数传给product,适配任意数量的输入数组
    for combo in product(*arrays):
        if sum(combo) == target_sum:
            valid_combos.append(combo)
    return valid_combos

# 调用示例
if __name__ == "__main__":
    a = [1,2,3,4,5,6]
    b = [0,3,5,7,9,10]
    c = [3,3,5,6,7,8]
    # 传3个、5个、10个数组都可以,不需要改函数逻辑
    print(find_target_combinations([a, b, c], target_sum=10))
  • 优点:逻辑简单,和你原来的嵌套循环行为完全一致,会自动保留所有合法的重复组合(比如示例中c数组有两个3,如果两个3都能凑出目标和,会分别返回对应组合),支持正数、负数、零的任意组合。
  • 缺点:时间复杂度是所有数组长度的乘积,数组数量多、单个数组长度大的时候,性能下降会很明显。

方案2:分治+哈希优化(适合数组数量较多的场景)

如果数组数量比较多,全量遍历笛卡尔积的计算量会爆炸,可以用Meet-in-the-middle思路把数组拆成两半分别计算,再通过哈希表匹配结果,时间复杂度可以降到原来的平方根级别。

from itertools import product
from collections import defaultdict

def find_target_combinations_fast(arrays: list[list[int]], target_sum: int):
    if not arrays:
        return []
    
    # 把数组拆成数量接近的两部分,平衡两边的计算量
    split_idx = len(arrays) // 2
    left_part = arrays[:split_idx]
    right_part = arrays[split_idx:]

    # 先遍历左半部分所有组合,记录每个和对应的所有组合
    left_sum_map = defaultdict(list)
    for left_combo in product(*left_part):
        current_sum = sum(left_combo)
        left_sum_map[current_sum].append(left_combo)
    
    valid_combos = []
    # 遍历右半部分组合,直接从哈希表找需要的左半和,不用全量双层遍历
    for right_combo in product(*right_part):
        current_sum = sum(right_combo)
        required_left_sum = target_sum - current_sum
        if required_left_sum in left_sum_map:
            for matched_left in left_sum_map[required_left_sum]:
                valid_combos.append((*matched_left, *right_combo))
    
    return valid_combos

可选优化点

  • 如果不需要保留重复组合,可以在传入数组前先对单个数组去重,能大幅减少无效计算
  • 如果所有数组元素都是非负数,可以在生成组合的过程中提前剪枝:当前部分和已经超过目标值时,直接跳过后续的组合生成,性能还能进一步提升
  • 如果只需要判断有没有符合条件的组合,不需要返回所有组合,找到第一个匹配项就可以直接返回,不用遍历完所有可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:27:24