嘿我正在研究一个算法,该算法采用用户输入的数字,然后通过一个大小为50的数组填充1到100之间的随机数,并查找所有加起来的数字组合输入的数字。
例如,给定一个整数数组[3,6,1,9,2,5,12]并传递整数值9,你会返回[[3,6],[6,1,2] ],[9],[3,1,5]。在数组中返回结果的顺序无关紧要,尽管你应该返回唯一的集合(即[6,3]和[3,6]是相同的,只返回一个)。此外,个别结果应该按照它们的顺序排列(即[6,1,2]应该返回,而不是[1,2,6])。
当我开始编写代码时,我遇到的第一个解决方案看起来效率极低。我目前正在尝试将每个组合分成它自己的数组,并且每次将一个数字添加到数组中时,都会检查数字是否等于输入,是否仍然小于,或者过去吧。它工作不正常,我觉得这可能是一种效率低下的方法:
for (int i = 0; i < list.length; i++) {
List<Integer> combo = new ArrayList<Integer>();
int counter = 0;
int current = list[i];
if (current == input){
System.out.println(i);
}
else if (current > input) {
continue;
}
else if (current < input) {
combo.add(current);
if (combo.size() >= 2) {
for (int j = 0; j < combo.size(); j++) {
counter += combo.get(j);
if (counter == input) {
System.out.println("Success");
break;
}
else if (counter < input) {
continue;
}
else if (counter > input) {
break;
}
}
}
}
}
答案 0 :(得分:0)
这是一个想法,我没有工作代码。尝试使用递归,测试具有最大可能数量的所有组合以及没有它的所有其余组合。功能如:Sums(Number,maxN),(maxN是我们可以采取的最大数量 - 在第一次调用它时,9)
你的例子是:
1.按照建议,对它们进行排序并切割大于输入
2.检查maxN是否大于总和所需的最小值,在你的例子中它是5(不能在你的集合中使用小于5的数字9);如果它没有返回(基本情况)。
3. maxN是否等于输入? (第一次打电话9)
a)是 - 第一个解决方案子集[9] + Sums(Number,dec(maxN))(dec(maxN)在第一次调用时将为6)
b)否 - 递归检查&#39; Number - maxN&#39;可以根据您的集合中的数字构建,Sums(数字 - maxN,dec(K)或最大数字&#39;数字 - maxN&#39;(取决于更小))+ Sums(Number,dec(maxN)) - 加上剩下的。
以下是仅计算的代码,将数字写成平方和的方法,它通过了HackerRank测试:
import math
def minArgument(x):
s = 0
i = 1
while s < x:
s = s + i * i
i = i + 1
return i - 1
def maxPower(a):
return math.floor(math.sqrt(a))
def sumOfSquares(M, K, cnt):
if M < 1:
return cnt
lowerLimit = minArgument(M)
if K < lowerLimit:
return cnt
else:
if K * K == M:
return sumOfSquares(M, K - 1, cnt + 1)
else:
return sumOfSquares(M, K - 1,sumOfSquares(M - K * K,
min(maxPower(M - K * K), K - 1), cnt))
经过简单的更改后,您可以获得多种解决方案。我现在不知道如何使用组合构建列表作为返回值...