获得数组中所有数字组合的最快方法,没有空格

Fastest way to get all combinations of numbers in array without gaps

本文关键字:方法 空格 组合 数组 数字      更新时间:2023-10-16

我需要从数组中每个可能的数字组合中计算总和(单独的总和,而不是一个总和)。组合不能跳过一个数字,因此:

对于y>x,您需要将a[x]和a[y]之间的每个数字相加。

对于n大小的数组,您有(n)+(n-1)+(n-2)++1,因此对于n=5,存在15个组合。

我需要做得尽可能快,空间不是问题。

编辑:我尝试过:

unsigned long long r_all = 0;
std::vector<int> g_seentimes(m);
for(int i = 0; i<n; i++)
    r_all += w[z];
    if(r_all > r){
        r = r_all;
    }
}
for(int j = 0; j<n; j++){
    unsigned long long r_temp = r_all;
    for(int i = 0; i<(n-j); i++){
        r_temp -= w[n-i];
        if( r_temp > r){
            r = r_temp;
        }
    }
    r_all -= w[y];
    if( r_all > r){
            r = r_all;
    }
}

for(int i = 0; i < n; i++){
    unsigned long long r_temp = 0;
    for(int j = 0; j<(n-i); j++){
        r_temp += w[i+j];
        if(r_temp > r){
            r = r_temp;
        }
    }
}
//r is the answer

编辑2:期望的输出是最大可能的数字,但我所提到的例子是简单的版本,最初如果有两个或多个相同的数字组合在一起,你不加它们中的任何一个的值,所以{5,3,5,3、1}=1,但{5、3、1}=9。我想好了这个部分,只需要最快的方式来完成所有组合。

编辑3:@Tuan333当被问及组合的数量时,我认为展示它会更容易:

X- chosen, x-unchosen
n = 5
XXXXX    XXXXx    XXXxx    XXxxx    Xxxxx
xXXXX    xXXXx    xXXxx    xXxxx
xxXXX    xxXXx    xxXxx
xxxXX    xxxXx
xxxxX

首先制作一个累积部分和的数组。所以如果你的数字是a = [1, 2, 3, 4, 5],那么这个数组就是b = [0, 1, 3, 6, 10, 15]。(注意,我在开头包含了空和,所以第二个数组要大一个。

现在观察,aij元素之和为b[j+1] - b[i]。所以现在你可以做一个双循环。

没有@btilly的解决方案那么优雅,但这里有一种直观的方法来生成您需要的所有序列:

X- chosen, x-unchosen
n = 5
Xxxxx
xXxxx
xxXxx
xxxXx
xxxxX
XXxxx
xXXxx
xxXXx
xxxXX
XXXxx
xXXXx
xxXXX
XXXXx
xXXXX
XXXXX

对于每个"块",您可以跟踪子序列中的数字数量(我们称之为blockLength)。然后,您只需要迭代原始数组即可获得所需的子序列,请注意,如果当前子序列的长度为blockLength,那么您需要在第(原始数组长度-blockLength)项左右终止。下面是生成所有子序列的代码(Java)。如果有重复的数字,可以通过预处理将其全部删除。

int[] a = {5,3,1};
for(int subSeqLength = 1; subSeqLength <= a.length; subSeqLength++){
    for(int j = 0; j + subSeqLength <= a.length; j++){
        for(int k = j; k <j+subSeqLength; k++)
            System.out.print(a[k]+" ");
        System.out.println();
    }
}