在Java中,如何获取数组中所有可能的不同和

在Java中,如何获取数组中所有可能的不同和,java,algorithm,Java,Algorithm,所有可能的不同和都意味着数组中任意一个、两个、三个到n(数组长度)的和。 例如,如果给定数组为[2,2,3] 数组中一个数字的和就是数组本身[2,2,3] 数组中任意两个数字的和为[4,5] 数组中三个数字的和为[7] 因此,结果应该是所有可能的总和的组合,即[2,3,4,5,7] 只需要算法的思想,不需要具体的代码。谢谢你最简单的方法是简单地遍历并获取总和,然后将它们添加到不允许重复的集合中 按要求编码: //following taken from http://rosettacode.or

所有可能的不同和都意味着数组中任意一个、两个、三个到n(数组长度)的和。 例如,如果给定数组为[2,2,3] 数组中一个数字的和就是数组本身[2,2,3] 数组中任意两个数字的和为[4,5] 数组中三个数字的和为[7] 因此,结果应该是所有可能的总和的组合,即[2,3,4,5,7]
只需要算法的思想,不需要具体的代码。谢谢你

最简单的方法是简单地遍历并获取总和,然后将它们添加到不允许重复的集合中

按要求编码:

//following taken from http://rosettacode.org/wiki/Power_set#Java
public static <T extends Comparable<? super T>> LinkedList<LinkedList<T>> BinPowSet(
        LinkedList<T> A){
    LinkedList<LinkedList<T>> ans= new LinkedList<LinkedList<T>>();
    int ansSize = (int)Math.pow(2, A.size());
    for(Integer i= 0;i< ansSize;++i){
        String bin= Integer.toString(i, 2); //convert to binary
        while(bin.length() < A.size())bin = "0" + bin; //pad with 0's
        LinkedList<T> thisComb = new LinkedList<T>(); //place to put one combination
        for(int j= 0;j< A.size();++j){
            if(bin.charAt(j) == '1')thisComb.add(A.get(j));
        }
        Collections.sort(thisComb); //sort it for easy checking
        ans.add(thisComb); //put this set in the answer list
    }
    return ans;
}
//use would be
Set<Integer> sums = new HashSet<Integer>();
LinkedList<Integer> powerList = new LinkedList<Integer>(Arrays.<Integer>asList(arr));
for(Collection<Integer> sumEntry : BinPowSet(powerList)) {
    int x = 0;
    for(Integer y : sumEntry) {
        x += y;
    }
    sums.add(x);
}
return sums;
//以下内容取自http://rosettacode.org/wiki/Power_set#Java

公共静态我将处理以下问题。 首先,我将构造一个函数来计算这些组合

组合(对象[]A,int r)

此函数将返回A中的所有nCr组合,其中n=A.length 一旦我有了这个函数,我可以为r=1,2,3调用它。。。然后打印总数

编写组合例程是一个相当标准的技术面试问题。

公共类StackOverflow{
public class StackOverflow {
static Set<Integer> tree=new TreeSet<Integer>();
public static void main(String args[]) {
    int [] array= {2,2,3};
    getAllSums(array,0,0);
    tree.remove(0);
    for (Integer i: tree)
        System.out.println(i);


}
public static void getAllSums(int[] numbersArray, int starting, int sum)
{   
    if(numbersArray.length == starting)
    {      
        tree.add(sum);    
        return;
    }
    int value = sum + numbersArray[starting];
    getAllSums(numbersArray, starting + 1, value);
    getAllSums(numbersArray, starting + 1, sum); 
}
静态集树=新树集(); 公共静态void main(字符串参数[]){ int[]数组={2,2,3}; getAllSums(数组,0,0); 树。移除(0); for(整数i:树) 系统输出打印LN(i); } 公共静态void getAllSums(int[]numbersArray,int start,int sum) { 如果(numbersArray.length==开始) { 树。加(和); 返回; } int值=总和+数字数组[起始]; getAllSums(数字数组,起始+1,值); getAllSums(数字数组,起始+1,总和); }
最简单的方法是对数组的每个子数组求和,并删除重复项。数据集是否太大而无法进行此操作?对数组进行排序可以为您提供一些有关加速算法的潜在方法的信息,但@freeone3000的方法将成为算法的核心。@freeone3000:子数组不起作用,在
[1,2,3]
你不会做1+3,是吗?假设OP也需要这个总和。@AndreaAmbu这取决于你如何定义子数组,我读到他的评论是作为主数组子集的每个数组,包括:空集[1]、[2]、[3]、[1,2]、[1,3]、[2,3]和[1,2,3]。对于大小为n的给定数组,有
n选择1
+
n选择2
+…+
n选择n
子数组(不一定是不同的)。这会非常快地变得非常大。您不能简单地删除重复项,您必须首先处理它们,因为它们本身可能具有唯一的和(如OP示例中的2+2是唯一的)。