如何找到数组中N个元素的所有可能总和?

时间:2020-09-20 14:45:09

标签: arrays algorithm loops recursion methods

我正在寻找有关如何找到N个元素的所有和的建议。例如,我有一个数组

int []arr={91,58,89,87,25,65,21};

对于某些int n=3;

我需要找到此数组中3个元素的所有可能总和。一开始,对我来说看起来很容易,因为我会找到大小为3的所有子数组的总和,但是我不确定大小为3的子序列。 我在Google上发现了类似的问题,解决方案是使用递归。我不确定我是否真的了解如何根据自己的条件解决此问题,希望您能给我一个建议和示例,以便我可以解决此问题!我不确定我的初始代码是否需要,因为它可以线性工作。

谢谢。

3 个答案:

答案 0 :(得分:1)

通过对每个元素进行三个for循环迭代,可以轻松地解决O(n ^ 3)时间复杂度的问题。

看看下面的python代码:

array = [91,58,89,87,25,65,21]
length = len(array)
n = 3

arraySum = []

for i in range(length - n + 1):
    sn = array[i]
    for j in range(i+1,length - n + 2):
        sn = sn + array[j]
        for k in range(j+1,length):
            sn = sn + array[k]
            arraySum.append(sn)

print(arraySum)

答案 1 :(得分:1)

请觉得这很有用,因为您似乎不了解术语“子序列”和“子阵列”。 Subarrays and Subsequences what are they

现在,如果您知道什么是子序列, 您的问题要求您找到具有不同总和的大小为N的计数子序列。我将在这里尝试递归版本的C ++代码,如果您不知道C ++语法,我将尝试Java:)。

void function(int size,int n,int sum,set<int> Set,int arr[],int iterator)
{
if(iterator>=arr.size())
    return;
if(size==n)
{
    Set.insert(sum);
    return;
}
function(size+1,n,sum+arr[iterator],Set,arr,iterator+1);
function(size, n,sum+arr[iterator],Set,arr,iterator+1);
}

您设置的大小将是您想要的答案。

答案 2 :(得分:1)

对于可变长度的子序列,我有此解决方案。 Java代码:

public static void main(String[] args) {
    int[] arr = {91, 58, 89, 87, 25, 65, 21};
    int n = 3;

    sum(arr, 0, n, 0);
}

public static void sum(int[] arr, int startIdx, int deep, int currSum) {
    if (deep == 1) {
        for (int i = startIdx; i < arr.length; i++)
            System.out.println(currSum + arr[i]);
    } else {
        for (int i = startIdx; i < arr.length; i++)
            sum(arr, i + 1, deep - 1, currSum + arr[i]);
    }
}

UPD: 如果您需要获取结果作为列表,则可以使用以下变体:

public static void main(String[] args) {
    int[] arr = {91, 58, 89, 87, 25, 65, 21};
    int n = 3;

    List<Integer> sums = sum(arr, n, 0);
    System.out.println(sums);
}

public static List<Integer> sum(int[] arr, int deep, int currSum) {
    List<Integer> list = new ArrayList<>();
    if (deep == 1) {
        for (int value : arr) list.add(currSum + value);
    } else {
        for (int i = 0; i < arr.length; i++)
            list.addAll(sum(Arrays.copyOfRange(arr, i + 1, arr.length), deep - 1, currSum + arr[i]));
    }
    return list;
}