【问题标题】:Find all continuous subsets with a particular sum(+ve or -ve) where the subset can contain both positive and negative integers查找具有特定总和(+ve 或 -ve)的所有连续子集,其中子集可以包含正整数和负整数
【发布时间】: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


【解决方案1】:

不,没有办法,因为存在具有给定总和的 O(N^2) 个切片的 N 元素数组。仅枚举输出需要 O(N^2)。

示例:数组 { +1, -1, +1, -1 ... }(长度 N = 2k+1)与所需的总和 +1。

  • 长度为 3 的 N-2 个切片的总和为 +1
  • 长度为 5 的 N-4 个切片的总和为 +1
  • ... 有 3 个长度为 N-2 的切片加起来为 +1
  • 有 1 个长度为 N 的切片加起来为 +1

总计:1 + 3 + ... + N-2 = 2 * (1 + 2 + ... + k) - k = k^2

【讨论】:

    【解决方案2】:

    因为我仍然无法对帖子发表评论...

    我们是否应该假设总和为 +1,设置 {1, -1, 1} 和 {-1, 1, 1} 不同?

    使用 3 个元素获得 +1 总和的唯一方法是 +1、+1 和 -1 的组合。

    现在假设元素的顺序很重要,最多可以有 3 个! = 6套,最多可加1。

    如果 N = 2k+1,设 k = 100,N = 201,我仍然看不出如何有 N-2 = 199 个长度为 3 且总和为 +1 的子集,除非 -1 在第二个位置并且-1 是在原始集合中的另一个位置被视为不同的 -1

    【讨论】:

    • 我怀疑发布答案而不是评论是个好主意!看来,从 OP 给出的例子来看,他的意思是“切片”,not“不同的切片”,当然不是“集合”或“不同的集合”(参见 { 1} 多次,以及未设置的 {1, -1, 1})。
    • 很抱歉发表评论作为答案,因为我还没有足够的声誉来发表评论。
    • 是的,这可能意味着您应该采取行动以获得声望点。通过违反规则,您可能会失去声誉。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2021-01-30
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多