Python - 来自两个列表的 K 求和


列表是 Python 中一种重要的数据类型,可以保存同构或异构数据的序列。它们是可变的。从两个列表中查找 K 求和意味着我们需要找到两个列表元素的组合,其加和正好等于 K。在本文中,我们将首先探讨暴力方法。接下来,我们将研究几种优化的算法,例如双指针方法、哈希算法、列表推导式等。

使用暴力方法

暴力法是最简单的方法。在这种方法中,我们在编写逻辑时不考虑代码优化。为了找到 K 求和,我们可以使用两个循环语句迭代列表并检查元素的总和。如果总和等于 K,我们可以将元素附加到任何数据结构,例如列表。

示例

在下面的代码中,我们使用了暴力算法。在 `k_sum_naive` 函数中,我们初始化了一个空列表。接下来,我们使用 for 循环迭代两个列表,在每次迭代中,我们检查两个元素的总和是否等于 K。如果等于 K,我们将元素作为元组元素附加到已初始化的列表中。

def k_sum_naive(list1, list2, k):
    result = []
    for num1 in list1:
        for num2 in list2:
            if num1 + num2 == k:
                result.append((num1, num2))
    return result
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]
k = 10
print(f'The first list is: {list1}')
print(f'The second list is: {list2}')
print(f'The required list is: {k_sum_naive(list1, list2, k)}')

输出

The first list is: [1, 2, 3, 4, 5]
The second list is: [6, 7, 8, 9, 10]
The required list is: [(1, 9), (2, 8), (3, 7), (4, 6)]
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

使用双指针方法

双指针方法是一种流行的算法技术,用于有效地解决各种问题。它涉及使用两个指针(通常称为“左”指针和“右”指针),它们同时从不同方向或速度遍历数组或列表。这种方法在处理需要查找满足特定条件的配对或子数组的问题时特别有用。这种方法在许多流行的问题中很有用,例如检测图中的循环、滑动窗口问题、排序链表等。

示例

在下面的示例中,我们使用 `k_sum_two_pointer` 从两个列表中返回 K 求和。在函数中,我们使用了 Python 的 `sort` 方法对列表进行排序。接下来,我们定义了两个分别名为 `ptr1` 和 `ptr2` 的指针。我们迭代列表并将总和为 K 的元素附加到已初始化的列表中。

def k_sum_two_pointer(list1, list2, k):
    list1.sort()
    list2.sort()
    result = []
    ptr1, ptr2 = 0, len(list2) - 1
    while ptr1 < len(list1) and ptr2 >= 0:
        sum = list1[ptr1] + list2[ptr2]
        if sum == k:
            result.append((list1[ptr1], list2[ptr2]))
            ptr1 += 1
            ptr2 -= 1
        elif sum < k:
            ptr1 += 1
        else:
            ptr2 -= 1
    return result

list1 = [1, 2, 3, 4, 5]
list2 = [12, 7, 8, 9, 10]
k = 13
print(f'The first list is: {list1}')
print(f'The second list is: {list2}')
print(f'The required list is: {k_sum_two_pointer(list1, list2, k)}')

输出

The first list is: [1, 2, 3, 4, 5]
The second list is: [12, 7, 8, 9, 10]
The required list is: [(1, 12), (3, 10), (4, 9), (5, 8)]
  • 时间复杂度:O(n log n)(由于排序)

  • 空间复杂度:O(1)

使用哈希方法

哈希方法通常用于计算机科学和编程中,以高效地存储、检索和操作数据。它涉及使用哈希函数将数据元素映射到唯一的标识符,称为哈希值或代码。为了从列表中获得 K 求和,我们可以采用以下算法

  • 我们可以维护一个哈希表来插入任何列表中的所有数字。

  • 接下来,我们可以迭代另一个列表,在每次迭代中,我们可以找到 K-element,其中 element 是第二个列表的元素。

  • 现在,我们可以使用哈希表查找该值 (K-element) 是否存在于第一个列表中。如果存在,则数字的总和将等于 K,因此我们得到答案!

示例

在下面的代码中,我们创建了函数 `k_sum_hashing`,它使用列表和值 K 作为参数。我们初始化了一个名为 `hash_table` 的字典和一个名为 `result` 的列表。接下来,我们迭代第一个列表并使用哈希将布尔值 True 映射到现有元素。现在我们迭代第二个列表,在每次迭代中,我们找到 (K-num2) 的值,其中 num2 是第二个列表的元素。使用哈希表,我们检查该值是否存在于第一个列表中,如果存在,我们将数字附加到已初始化的列表中。

def k_sum_hashing(list1, list2, k):
    hash_table = {}
    result = []
    for num1 in list1:
        hash_table[num1] = True
    for num2 in list2:
        complement = k - num2
        if complement in hash_table:
            result.append((complement, num2))
    return result

list1 = [1, 2, 3, 4, 5]
list2 = [12, 7, 8, 9, 10]
k = 13
print(f'The first list is: {list1}')
print(f'The second list is: {list2}')
print(f'The required list is: {k_sum_hashing(list1, list2, k)}')

输出

The first list is: [1, 2, 3, 4, 5]
The second list is: [12, 7, 8, 9, 10]
The required list is: [(1, 12), (5, 8), (4, 9), (3, 10)]
  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

使用列表推导式

列表推导式是 Python 中创建列表元素的一种流行方法。使用列表推导式的优点是我们可以轻松地将多个条件语句、循环等组合在一行中。但是,我们不能在列表推导式技术中编写太多复杂的条件。

示例

在下面的代码中,我们使用列表推导式创建总和为 K 的对。我们创建了函数 `k_sum_list_comprehension`,它将列表和值 K 作为参数。在这个函数中,我们使用列表推导式来检查列表中元素对的总和是否加起来等于 K。如果为真,我们将对附加到列表并返回它。

def k_sum_list_comprehension(list1, list2, k):
    return [(num1, num2) for num1 in list1 for num2 in list2 if num1 + num2 == k]

list1 = [1, 2, 3, 4, 5]
list2 = [8,5,7,4]
k = 9
print(f'The first list is: {list1}')
print(f'The second list is: {list2}')
print(f'The required list is: {k_sum_list_comprehension(list1, list2, k)}')

输出

The first list is: [1, 2, 3, 4, 5]
The second list is: [8, 5, 7, 4]
The required list is: [(1, 8), (2, 7), (4, 5), (5, 4)]
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

使用 Itertools 库

Python 中的 itertools 库提供了一种强大的方法来迭代可迭代对象。它提供了各种工具来处理涉及迭代器的常见编程任务,例如生成组合、排列和笛卡尔积。这是 Python 标准库的一部分。我们可以利用 itertools 库生成列表元素的组合,并使用自定义逻辑来检查组合是否给出等于 K 的总和。

示例

在下面的代码中,我们首先导入了 Python 的 itertools 库。在 `k_suum_product` 函数中,我们使用 itertools 的 `product` 方法生成列表元素的组合。接下来,我们使用列表推导式检查每个组合的元素总和是否等于 K。如果为真,我们将对附加到 `pairs` 列表中。

import itertools
def k_sum_product(list1, list2, k):
    pairs = list(itertools.product(list1, list2))
    return [(num1, num2) for (num1, num2) in pairs if num1 + num2 == k]
list1 = [1, 2, 3, 4, 5]
list2 = [8,5,7,4]
k = 9
print(f'The first list is: {list1}')
print(f'The second list is: {list2}')
print(f'The required list is: {k_sum_product(list1, list2, k)}')

输出

The first list is: [1, 2, 3, 4, 5]
The second list is: [8, 5, 7, 4]
The required list is: [(1, 8), (2, 7), (4, 5), (5, 4)]
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(n^2)

结论

在本文中,我们了解了如何在 Python 中处理来自两个列表的 K 求和。我们可以构建自定义代码并使用 Python 中提供的库。Python 默认情况下没有任何库来执行此函数,但它为我们提供了执行许多标准操作的方法,我们可以利用这些方法来解决问题。同时,暴力法、使用 Lambda 函数等更容易理解。它们需要更好的优化逻辑。因此,最好使用哈希、双指针等来解决问题。

更新于:2023年7月18日

浏览量:106

开启你的职业生涯

通过完成课程获得认证

开始学习
广告