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