所有可能的不同總和意味着數組中任意一個,兩個,三個到n(數組的長度)數的總和。例如,如果給定數組是[2,2,3] ,則數組中一個數字的總和就是數組本身[2,2,3] ,數組中任意兩個數字的和就是[4, 5] 數組中三個數的和爲[7] 因此,結果應該是所有可能和的組合,即[2,3,4,5,7] 只是算法的思想請,不需要特定的代碼。謝謝in Java如何獲得數組中所有可能的不同總和
回答
最簡單的方法是簡單地遍歷並拿出總和並將它們添加到不允許重複的集合中。根據要求
你不能簡單地刪除重複首先你必須處理它們,因爲他們本身可能有獨特的總和(如OP例2 + 2是獨特的)。 – twain249 2012-04-24 23:09:33
你是對的,誤讀OP。編輯。 – BVSmallman 2012-04-24 23:13:41
代碼:
//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;
注意,複製可以被刪除。加法是共享的,因此,任何不以任何次序添加單個元素兩次的集合中的元素的總和將出現在上面。
另請注意,雖然考慮了番石榴的Sets.powerSet(),但它需要一個實際的Set作爲輸入,它不允許重複(在本例中出現)。
我會以如下方式處理問題。首先我會構造一個函數來計算組合。
組合(對象[] A,INT R)
該函數將返回我從A,所有nCr的組合,其中n =則爲a.length 有一次,我在地方有這個功能,我可以稱它爲R = 1,2,3 ...並打印總和。
書寫組合例程是一個非常標準的技術面試問題。
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);
}
- 1. 如何獲得多維數組的所有可能組合
- 2. 如何使用NSPredicate CONTAINS IN數組獲得所有項目
- 3. 如何從包含另一個數組的所有元素的數組中獲得所有可能的組合
- 4. 確定所有可能的組合的值,總和爲所需的總數
- 5. 如何使從數組元素的所有可能的總和組合在VB
- 6. defaultdict如何獲得列表中所有值的總和?
- 7. SQL CASE和JOINS:如何獲得不同的計數和總計?
- 8. 如何獲得同一行中不同列的總和?
- 9. 如何獲得所有可能的組合在Array
- 10. 如何獲得Python中範圍函數中所有數字的總和?
- 11. 如何獲得所有項目的最大總和的子數組
- 12. 如何獲得json數組的總數?
- 13. Django:如何獲得有關單行的所有行的總和
- 14. 如何獲得列表中的所有可能的訂單
- 15. Java如何獲得總結每個枚舉的所有值
- 16. 如何獲得不同列的總值?
- 17. 獲取Java中數組的總和
- 18. 如何獲得mysql中不同字段的值的總和?
- 19. 如何獲取兩個不同列表的所有可能組合?
- 20. 從嵌套數組中獲得總和
- 21. oracle sql在表中獲得所有可能的組合
- 22. 如何獲得不同表格的總和但列名相同
- 23. 是否有可能在此查詢中獲得overall_score的總和?
- 24. 如何從我的JSON數組中獲得列的總和
- 25. 如何獲得另一列中每個不同值的總和?
- 26. 所有可能的總和列的SQL
- 27. 如何獲得java中的所有許可?
- 28. 如何從URL中獲取所有可能的目錄組合
- 29. 將數組分組並獲得總和
- 30. 如何查找數組中所有數字的總和?
最簡單的方法就是將數組的每個子數組相加,並刪除重複項。數據集是否太大而無法正常工作? – freeone3000 2012-04-24 22:58:27
對數組進行排序應該爲您提供一些有關加速算法的潛在方法的信息,但是@ freeone3000的方法是其核心。 – twain249 2012-04-24 23:00:53
@ freeone3000:子數組不會工作,在'[1,2,3]'你不會做1 + 3,你會嗎?鑑於OP也需要這筆款項。 – 2012-04-24 23:01:13