avatar
g*j
1
给一个int数组, 求出所有和为0的子数组? 怎么求?
最优化的算法是什么?
avatar
p*2
2

DFS+剪枝?

【在 g***j 的大作中提到】
: 给一个int数组, 求出所有和为0的子数组? 怎么求?
: 最优化的算法是什么?

avatar
w*x
3
b[i] = a[0] + ... + a[i]
扫描b加hash_map查相同的数
avatar
f*e
4
位置不一定连续。

【在 w****x 的大作中提到】
: b[i] = a[0] + ... + a[i]
: 扫描b加hash_map查相同的数

avatar
d*n
5
vector subsets(vector a) {
int n = a.size();
// minimum negative sum
int min = 0;
// max postive sum
int max = 0;

for(int i = 0; i < n; i++) {
if (a[i] < 0) {
min += a[i];
}
else {
max += a[i];
}

// mask[i] = 1 means there is a sub sum equals to i
int mask[] = new int[-min + max + 1];
// lookupTable[i, j] = 1 means there is a sub sum equals to j
// and a[i] is in the sub set
vector> lookupTable(n, -min + max +1);
for( int i = 0; i < n; ++i) {
lookupTable[i][a[i]-min] = 1;
mask[a[i]-min] = 1;
for(int j= 1; i + j < n; ++j) {
for (int k = math.min(0, -a[j]); k < max + 1 -min; ++k) {
if (mask[k]) {
mask[k+a[j] = 1;
lookupTable[j][k+a[j] = 1;
}
}
}
}
vector output;
output.push_back(subsets(mask, lookupTable, 0));

for(int i = 1; i < math.min(max, -min); i++) {
if (mask[i - min] == 1 && mask[-i - min] == 1) {
foreach(vector sub in outer_join(subsets(mask, lookupTable,
i), subsets(mask, lookupTable, -i))) {
output.push_back(sub);
}
}
}

return output;
}
vector> subsets(vector mask, vector>lookupTable
, int target) {
return all subsets which sum to target;
}
avatar
h*e
6
子集合数吧。。dp或者搜索。
avatar
h*3
7
Re。
求subset,然后算每个subset的sum,肯定可以。不过不知道是不是最优。

【在 h*******e 的大作中提到】
: 子集合数吧。。dp或者搜索。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。