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

时间:2012-04-24 22:55:44

标签: java algorithm

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

4 个答案:

答案 0 :(得分:0)

最简单的方法是简单地迭代并获取总和并将它们添加到不允许重复的集合中。

答案 1 :(得分:0)

所要求的代码:

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

请注意,可以删除重复的 。添加是公共的,因此在任何顺序中,任何顺序都不会添加单个元素两次的集合元素的总和将出现在上面。

另请注意,虽然考虑了Guava的Sets.powerSet(),但它需要一个实际的Set作为输入,这将不允许重复(在示例中存在)。

答案 2 :(得分:0)

我会按照以下方式处理这个问题。 首先,我将构建一个计算组合的函数。

组合(Object [] A,int r)

此函数将返回来自A的所有nCr组合,其中n = A.length 一旦我有了这个功能,我可以调用r = 1,2,3 ...并打印总和。

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

答案 3 :(得分:0)

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