我正在寻找有关如何找到N个元素的所有和的建议。例如,我有一个数组
int []arr={91,58,89,87,25,65,21};
对于某些int n=3;
我需要找到此数组中3个元素的所有可能总和。一开始,对我来说看起来很容易,因为我会找到大小为3的所有子数组的总和,但是我不确定大小为3的子序列。 我在Google上发现了类似的问题,解决方案是使用递归。我不确定我是否真的了解如何根据自己的条件解决此问题,希望您能给我一个建议和示例,以便我可以解决此问题!我不确定我的初始代码是否需要,因为它可以线性工作。
谢谢。
答案 0 :(得分:1)
通过对每个元素进行三个for循环迭代,可以轻松地解决O(n ^ 3)时间复杂度的问题。
看看下面的python代码:
array = [91,58,89,87,25,65,21]
length = len(array)
n = 3
arraySum = []
for i in range(length - n + 1):
sn = array[i]
for j in range(i+1,length - n + 2):
sn = sn + array[j]
for k in range(j+1,length):
sn = sn + array[k]
arraySum.append(sn)
print(arraySum)
答案 1 :(得分:1)
请觉得这很有用,因为您似乎不了解术语“子序列”和“子阵列”。 Subarrays and Subsequences what are they?
现在,如果您知道什么是子序列, 您的问题要求您找到具有不同总和的大小为N的计数子序列。我将在这里尝试递归版本的C ++代码,如果您不知道C ++语法,我将尝试Java:)。
void function(int size,int n,int sum,set<int> Set,int arr[],int iterator)
{
if(iterator>=arr.size())
return;
if(size==n)
{
Set.insert(sum);
return;
}
function(size+1,n,sum+arr[iterator],Set,arr,iterator+1);
function(size, n,sum+arr[iterator],Set,arr,iterator+1);
}
您设置的大小将是您想要的答案。
答案 2 :(得分:1)
对于可变长度的子序列,我有此解决方案。 Java代码:
public static void main(String[] args) {
int[] arr = {91, 58, 89, 87, 25, 65, 21};
int n = 3;
sum(arr, 0, n, 0);
}
public static void sum(int[] arr, int startIdx, int deep, int currSum) {
if (deep == 1) {
for (int i = startIdx; i < arr.length; i++)
System.out.println(currSum + arr[i]);
} else {
for (int i = startIdx; i < arr.length; i++)
sum(arr, i + 1, deep - 1, currSum + arr[i]);
}
}
UPD: 如果您需要获取结果作为列表,则可以使用以下变体:
public static void main(String[] args) {
int[] arr = {91, 58, 89, 87, 25, 65, 21};
int n = 3;
List<Integer> sums = sum(arr, n, 0);
System.out.println(sums);
}
public static List<Integer> sum(int[] arr, int deep, int currSum) {
List<Integer> list = new ArrayList<>();
if (deep == 1) {
for (int value : arr) list.add(currSum + value);
} else {
for (int i = 0; i < arr.length; i++)
list.addAll(sum(Arrays.copyOfRange(arr, i + 1, arr.length), deep - 1, currSum + arr[i]));
}
return list;
}