【问题标题】:How do i find all possible sums of N elements in an array?如何找到数组中所有可能的 N 个元素的总和?
【发布时间】:2021-01-06 20:03:12
【问题描述】:

我正在寻找有关如何找到所有可能的 N 元素总和的建议。比如我有一个数组

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

对于一些int n=3;

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

提前谢谢你。

【问题讨论】:

    标签: arrays algorithm loops recursion methods


    【解决方案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]);
        }
    }
    

    统一更新: 如果您需要将结果作为列表获取,您可以使用此变体:

    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;
    }
    

    【讨论】:

    • 非常感谢您的回答和您的时间。我已尝试将您的答案应用于我的代码,但我找不到返回原型int 的方法。也许你也可以帮助我。
    • @eldlit 请告诉我更多关于您的问题的信息。你使用什么语言?您可以显示您的代码,这将是最简单的方法。
    • 我正在使用 Java,我需要将这些数字作为数组或 ArrayList 获取,以便我可以在我的主要方法中使用它们。我自己做不到,因为递归对我来说很新,而且我真的不知道如何在这些 if-else 语句中使用 return 语句。
    • @eldlit 我添加了返回列表到我的答案的解决方案
    【解决方案2】:

    请发现这很有帮助,因为您似乎不了解子序列和子数组这两个术语。 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);
    }
    

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

    【讨论】:

    • 非常感谢。我知道一些 C++ 语法,因为我去年在大学学习了一些 C,现在我们正在学习 C++ 和 Java。非常感谢您的链接和您的回答,因为它对上述任何内容都非常有帮助。
    【解决方案3】:

    您可以使用三个迭代每个元素的 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)
    

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多