任务是找到所有连续子集,或者更好地说是具有特定总和的子数组,其中子集可以包含正整数和负整数示例:对于子集={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) 时间复杂度中做到这一点?