获得数组中所有数字组合的最快方法,没有空格
Fastest way to get all combinations of numbers in array without gaps
我需要从数组中每个可能的数字组合中计算总和(单独的总和,而不是一个总和)。组合不能跳过一个数字,因此:
对于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]
。(注意,我在开头包含了空和,所以第二个数组要大一个。
现在观察,a
的i
到j
元素之和为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();
}
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 2D数组来自文本输入,中间有空格
- 处理多个异常集合的C++方法
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 在字符串中找到单词出现数量的最佳方法(C ,字符串中没有空格)
- 在 c++ 中删除标点符号和空格的最佳方法是什么
- 使用 getchar() 输入字符的最有效方法,就像 cin 中没有换行符和空格字符一样C++
- 用空格分隔字符串的最简单方法
- 在C++中按空格拆分字符串的最快方法
- 有没有一种简单的方法可以检查cin输入是否有空格
- 获得数组中所有数字组合的最快方法,没有空格
- 输入迭代器跳过空格,任何防止这种跳过的方法
- 有没有一种不使用std::getline从文件中读取空格的方法?
- 检查 std::string 是否只有空格的有效方法
- 从使用sstream读取的单词中删除最后一个空格的最佳方法