查找连续的子数组(没有和)

Finding contiguous subarray (without sum)

本文关键字:数组 连续 查找      更新时间:2023-10-16

我想要求为给定数组查找连续子数组的快速方法。请注意,我不是在寻找最大和连续子数组,而是想对获得的子数组执行其他操作。我已经知道下面的算法,但我正在寻找更有效的算法,因为这一个有一个非常差的时间复杂度。

// N = number of elements in array A.
void subarr(int N, int A[]) {
  for (int i = 0; i < N; i++) {
    for (int j = i; j < N; j++) {
      for (int k = j; k < N; k++) {
        cout << A[k] << ' ';
      }
      cout << endl;
    }
  }
}

正如其他人在评论中指出的那样,你的例子是不正确的。它应该读起来像

for (int i = 0; i < N; i++) {
   for (int j = N-1; j >= i; j--) {
      for (int k=i; k<=j; k++) {
         cout << "A[" << k << "] ";
     }
     cout << endl;
   }
}

注意,我将输出更改为只按字面意思打印A[k]。这将只打印每一个子数组一次。

至于你的问题,再一次,正如其他人指出的,这个算法打印每个子数组一次,没有任何额外的工作。我不相信您可以省去运行时,因为这几乎是您必须做的最少的工作。这三个嵌套循环确实有一些开销,但您可能需要全部三个循环:例如,用

指定子数组
  1. 其起始点
  2. 其终点或长度

,你必须打印/剪切中间的内容,从而产生第三个循环。