最快的方法,无需间隙即可获得数组中的所有数字组合

时间:2014-10-25 09:51:59

标签: c++ arrays algorithm

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

对于y> x你需要在[x]和[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

2 个答案:

答案 0 :(得分:3)

首先制作累积部分和的数组。因此,如果您的数字为a = [1, 2, 3, 4, 5],则该数组将为b = [0, 1, 3, 6, 10, 15]。 (注意,我在开头包含空的总和,所以第二个数组是一个更大的。

现在观察,i的{​​{1}}到j元素之和为a。所以现在你可以做一个双循环。

答案 1 :(得分:1)

不如@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();
    }
}