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

如何在Python列表中查找和为90的子列表?

嘿,这个问题得先明确你要找的是连续的子数组还是非连续的子序列——毕竟你给出的两个例子里,[50,40]在原数组里是不连续的,而[30,50,10](我猜你可能笔误写成了[50,30,10])是连续的。下面我给你两种场景的实现方案:

解法1:寻找和为目标值的连续子数组

因为你的数组里全是正数,用滑动窗口法效率最高,时间复杂度是O(n),比暴力枚举的O(n²)快很多。思路就是用两个指针维护一个窗口,动态调整窗口内元素的和,直到找到等于目标值的窗口。

def find_continuous_subarray(arr, target):
    left = 0
    current_sum = 0
    
    for right in range(len(arr)):
        current_sum += arr[right]
        
        # 当窗口内的和超过目标值时,移动左指针缩小窗口
        while current_sum > target and left <= right:
            current_sum -= arr[left]
            left += 1
        
        # 找到符合条件的连续子数组,直接返回
        if current_sum == target:
            return arr[left:right+1]
    
    # 如果遍历完都没找到,返回空列表
    return []

# 测试代码
original_arr = [100, 150, 30, 50, 10, 20, 40]
target_sum = 90
print(find_continuous_subarray(original_arr, target_sum))  # 输出: [30, 50, 10]
解法2:寻找和为目标值的非连续子序列

如果要找像[50,40]这种不连续的子序列,可以用回溯法来枚举所有可能的元素组合,筛选出和为90的结果。这种方法会找出所有符合条件的子序列,如果你只需要其中一个,可以在找到后立刻终止递归。

def find_subsequences(arr, target):
    result = []
    
    def backtrack(start_index, current_path, current_sum):
        # 找到符合条件的子序列,加入结果列表
        if current_sum == target:
            result.append(current_path.copy())
            return
        # 如果当前和超过目标值,或者遍历完所有元素,直接返回
        if current_sum > target or start_index >= len(arr):
            return
        
        # 选择当前元素,继续递归
        current_path.append(arr[start_index])
        backtrack(start_index + 1, current_path, current_sum + arr[start_index])
        
        # 不选择当前元素,继续递归(回溯)
        current_path.pop()
        backtrack(start_index + 1, current_path, current_sum)
    
    backtrack(0, [], 0)
    return result

# 测试代码
original_arr = [100, 150, 30, 50, 10, 20, 40]
target_sum = 90
print(find_subsequences(original_arr, target_sum))
# 输出会包含所有符合条件的子序列:[[30, 50, 10], [30, 20, 40], [50, 40]]

如果只需要第一个找到的非连续子序列,可以修改回溯函数,找到后立刻返回:

def find_one_subsequence(arr, target):
    def backtrack(start_index, current_path, current_sum):
        if current_sum == target:
            return current_path.copy()
        if current_sum > target or start_index >= len(arr):
            return None
        
        # 选择当前元素
        res = backtrack(start_index + 1, current_path + [arr[start_index]], current_sum + arr[start_index])
        if res is not None:
            return res
        
        # 不选择当前元素
        return backtrack(start_index + 1, current_path, current_sum)
    
    return backtrack(0, [], 0)

print(find_one_subsequence(original_arr, target_sum))  # 输出第一个找到的子序列,比如[30,50,10]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:52:51