如何找列表中相加等于一个数

有一个列表nums=[3,6,10,14,2,7],编写程序找到列表中相加等于9的任意集合

遍历这个列表的每一个组合,计算和是否为9:

import itertools

nums=[3,6,10,14,2,7]
# 生成num中的所有组合
ls = []
for i in range(2, len(nums) + 1):
    # 生成组合,放入ls中
    ls += list(itertools.combinations(nums, i))

# 遍历所有组合
#print(ls)
for i in ls:
    if sum(i) == 9:
        print(i)

输出:
(3, 6)
(2, 7)
本想排序,遍历到结果大于9,就不再遍历后面的组合,但sorted()方法是按组合中元素大小排,没有综合元素数量,所以去掉排序了。

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以解决这个问题。

    解决方案:

    方法一:暴力枚举法。利用两重循环遍历所有可能的组合,如果和为9,则存入结果中。

    代码如下:

    nums = [3, 6, 10, 14, 2, 7] result = []

    for i in range(len(nums)): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == 9: result.append([nums[i], nums[j]])

    print(result)

    该方法的时间复杂度为O(n^2),空间复杂度为O(1),在数据规模较小的情况下比较适用。

    方法二:哈希表法。先将所有的数存入哈希表中,然后遍历列表,将9减去当前数的结果在哈希表中进行查找,找到则存入结果中。

    代码如下:

    nums = [3, 6, 10, 14, 2, 7] result = [] hash_map = {}

    for num in nums: hash_map[num] = num

    for num in nums: if 9 - num in hash_map: if nums.index(num) == nums.index(9 - num): continue result.append([num, 9 - num])

    print(result)

    该方法的时间复杂度为O(n),空间复杂度为O(n),在数据规模较大时适用。

    方法三:双指针法。先对列表进行排序,然后使用双指针从两端同时遍历,如果和大于9,则将右指针向左移动,如果和小于9,则将左指针向右移动,直到左右指针相遇。

    代码如下:

    nums = [3, 6, 10, 14, 2, 7] result = [] nums.sort()

    left = 0 right = len(nums) - 1

    while left < right: if nums[left] + nums[right] == 9: result.append([nums[left], nums[right]]) left += 1 right -= 1 elif nums[left] + nums[right] < 9: left += 1 else: right -= 1

    print(result)

    该方法的时间复杂度为O(nlogn),空间复杂度为O(1),在数据规模较大时适用。

    参考资料:https://leetcode-cn.com/problems/two-sum/