我有一个数字列表:[10, 13, 15]
。我试图在列表中找到加起来或小于目标28的数字组合。
目前我有一个递归方法:
public void combinations(ArrayList<Integer>data,int fromIndex, int endIndex)
{
int sum = 0;
int target = 28;
ArrayList<Integer>results = new ArrayList<Integer>();
if(fromIndex == endIndex)
{
return;
}
for(int currentIndex = fromIndex; currentIndex < endIndex; currentIndex++)
{
if(sum + data.get(currentIndex) <= target)
{
results.add(data.get(currentIndex));
sum +=data.get(currentIndex);
}
}
System.out.println(results);
combinations(data, fromIndex + 1, endIndex);
}
目前这个输出:
[10, 13],[13, 15],[15]
这是正确的,我理解为什么我得到这些解决方案,因为我的递归方法有+1。然而,其他解决方案,如[10],[13],[10,10]
等不包括在内,我想知道如何实现这一点,我是否需要在递归方法中更改增量?
答案 0 :(得分:1)
public static void combinations(ArrayList<Integer> arr, ArrayList<ArrayList<Integer>> ans, int startIndex, int endIndex, int sum) {
if(startIndex > endIndex) {
for(ArrayList<Integer> x : ans) {
System.out.println(x);
}
return;
}
ArrayList<Integer> newTemp;
ArrayList<ArrayList<Integer>> newAns = new ArrayList<ArrayList<Integer>>();
for(ArrayList<Integer> x : ans) {
newAns.add(x);
}
for(ArrayList<Integer> x : ans) {
int s = 0;
newTemp = new ArrayList<Integer>();
for(Integer v : x) {
newTemp.add(v);
s+=v;
}
if(s + arr.get(startIndex) <= sum) {
newTemp.add(arr.get(startIndex));
newAns.add(newTemp);
}
}
if(arr.get(startIndex) <= sum ) {
newTemp = new ArrayList<Integer>();
newTemp.add(arr.get(startIndex));
newAns.add(newTemp);
}
combinations(arr,newAns, startIndex+1, endIndex, sum);
}
我必须重写您的代码,因为我无法通过您的代码进行思考。
其次,我必须一直制作一个newArrayList,以避免我第一次面对的ConcurrentModificationException,并在获得一些相关知识后稍后克服。
现在,这个方法应该被称为
public static void main (String[] args) {
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(10);
arr.add(15);
arr.add(13);
arr.add(-5);
arr.add(28);
combinations(arr, new ArrayList<ArrayList<Integer>>(), 0, 4, 28);
}
说明:我已经概括了你的问题的答案,以适应int范围内的任何总和。 我创建了ArrayList的ArrayList,它将打印基本情况下的所有组合。