【发布时间】:2013-07-03 13:41:19
【问题描述】:
任务是找到所有连续的子集,或者更好地说是具有特定总和的子数组,其中子集可以包含正整数和负整数 例子: 对于子集={1,-1,1,-1,1} 所有导致总和 1 的子集是:
{1}
{1,-1,1}
{1}
{1,-1,1,-1,1}
{1,-1,1}
{1}
这意味着有 6 个子集的总和为 1...我已经通过保存以前的总和进行了尝试,但我仍然只能使用 2 个循环来做到这一点......一个从 0 到 n,另一个从 0 到 i-1 这是代码:
for (i = 0; i < n; i++)
{
scanf("%d", &a1[i]);
sum[i] = a1[i] + a1[i - 1];
}
sum[0] = INT_MAX;
for (i = 0; i < n; i++)
{
if (a1[i] == 1 || a1[i] == -1)
{
count++;
}
if (i > 0)
{
if (sum[i] == 1 || sum[i] == -1)
{
count++;
}
for (j = 0; j < i - 1; j++)
{
if ((sum[i - 1 - j] + a1[i] == 1) || (sum[i - 1 - j] + a1[i]) == -1)
{
count++;
}
sum[i - 1 - j] += a1[i];
}
}
}
有没有办法在 O(n) 或 O(nlogn) 时间复杂度内做到这一点?
【问题讨论】:
-
您能否正确缩进该代码以使其可读?
-
没有什么python问题..但我认为也许我们需要使用哈希表之类的东西,也许用户在python中有更好的方法..我只想要这个方法复杂性 O(n) 或 O(nlogn).. 语言无关紧要.. 很抱歉格式化问题.. 这是我的第一个问题所以不知道..
-
我认为可能没有可行的方法来检查
O(n^2)可能的部分总和小于O(n^2)时间...
标签: c complexity-theory