当前位置: 首页 > 知识库问答 >
问题:

如何在O(n^2)中找到给定数组中每个可能的三元组的和?

龙欣德
2023-03-14

我有这样一个数组:

1,2,3,4,5。

我想找出每一个可能的三元组的总和,比如:123、124、125、134、135等等

我曾尝试使用3个while循环和3个变量(I,j,k)迭代每个三元组,但时间复杂度是O(n^3),我希望是O(n^2)。

希望有人来帮忙。

共有2个答案

穆嘉
2023-03-14

Python有一个内置的方法来做这件事。

时间复杂度:itertools的计算复杂度是多少。python中的组合?

代码:

import itertools
print(list(itertools.combinations(range(1,6),3)))

结果:

[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]

如果你需要一笔钱

代码:

import itertools
print(sum([int(''.join(map(str,x))) for x in list(itertools.combinations(range(1,6),3))]))

结果:

1845
王宏扬
2023-03-14

n的k置换?我的第一次尝试是这样的,因为数组类似于[1,2,3,…,n,n1],并且3的和将重复:

unique_sums = set()

iter_counter = [0]
call_counter = [0]
def sum_permute(arr, perm, k):
    call_counter[0] += 1
    result = sum(perm)
    if result in unique_sums:
        return
    if len(perm) == k:
        iter_counter[0] += 1
        # print(f"sum{perm}={result}")
        unique_sums.add(result)
        return
    for el in arr:
        iter_counter[0] += 1
        if el not in perm:
            perm.add(el)
            sum_permute(arr, perm, k)
            perm.pop()

如果不丢弃重复的和,则在n(n-1)(n-2)。。。(n-k1),k=3~O(n^3),假设在集合中查找beO(1)。无论如何,结果如下:

arr = [el for el in range(100)]
sum_permute(arr ,set(), 3)
print(f"Total elements: {len(arr)}")
print(f"Total iterations: {iter_counter[0]}")
print(f"Total function call: {call_counter[0]}")
print(f"n^2={len(arr)}^2={len(arr)**2}")

结果:

Total elements: 100
Total iterations: 3372
Total function call: 3091
n^2=100^2=10000

 类似资料:
  • 我记录一个设备,每15分钟读取3个值(,,)。它们可以重复。 我需要找出每小时在该间隔内读取的12个值中最大的3个值是什么。我对它们何时发生不感兴趣,只对它们的值感兴趣。 目前,我的算法还远远不够高效和快速: 在每组中循环: 我想去掉这个循环,使用原生的pandas/numpy方法。可能吗? 编辑:在这篇文章的末尾提出了一个可行的解决方案 以下是代码: 回报: 解决方案 我在代码中实现这个解决方案

  • 本文向大家介绍在C ++中从给定的三个排序数组中查找三个最接近的元素,包括了在C ++中从给定的三个排序数组中查找三个最接近的元素的使用技巧和注意事项,需要的朋友参考一下 假设我们有三个排序的数组A,B和C,以及分别来自A,B和C的三个元素i,j和k,使得max(| A [i] – B [i] |,| B [j] – C [k] |,| C [k] – A [i] |)被最小化。因此,如果A =

  • 给定一个整数的排序数组,我们能建立一个O(n^2)中所有对之和的排序数组吗? 一个简单的解决方案是以O(n^2)构建和数组,然后以O(n^2(log(n^2))=O(n^2 logn)时间对其进行排序。 另一个解决方案是构建n个排序数组,每个数组有n个数字,单位为O(n^2),并在O(n^2 logns)时间内合并它们(例如,请参见此处)。 我们能做得更好吗?

  • 我想从数组创建所有可能的数组可能大于或小于。输出数组中的元素不必是唯一的。 例如: 根据这个数组 给定所需大小的函数,应返回: 例2 根据这个数组 给定所需大小的函数,应返回: 用Swift怎么做?

  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?

  • 返回数组中的每个第 n 个元素。 使用 Array.filter() 创建一个包含给定数组的每个第 n 个元素的新数组。 const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); everyNth([1, 2, 3, 4, 5, 6], 2); // [ 2, 4, 6 ]