如何找到给定数字数组的最大跨度?

时间:2013-10-10 23:39:06

标签: algorithm recursion recurrence

我想解决的问题如下:我想找到一个给定数组的给定数组的最大数字范围A由正整数和负整数组成,返回最大值(A [j] - A [i])使得1 <= i <1。 j&lt; = n,我想出了以下nlogn时间算法来解决这个问题 -

  1. 找到数组的n阶统计量的索引,让它为“i”
  2. 找到数组的第一阶统计量的索引,让它为“j”
  3. 如果我&gt; j,然后返回差异,因为我们发现了数组的最大元素和最小元素之间的差异,因此只是终止返回差异。
  4. 如果j>我然后将数组分成两半并通过递归调用此算法找到两半中的最大跨度,即A [1 .... i]和A [i + 1 ...... n],案例为当算法找到这样一对i,j时,它返回这些对之间的差异,否则它会不断递归并最终终止。
  5. 返回子阵列1的最大{max_span,subarray2的max_span}
  6. 这个算法是O(nlogn),但我不知道它是否正确。

2 个答案:

答案 0 :(得分:3)

@mrip解决方案的复杂性是时间上的O(n)和空间中的O(n)。这是正确的,但只有O(1)空间复杂度足以解决这个问题。

int min=a[0],ans=0;
for (int i=1;i<n;i++)
    if (a[i]<min) min=a[i];
    else ans=max(ans,a[i]-min);
return ans;

答案 1 :(得分:2)

这是一个O(n)算法。

  1. 构建数组Max,其中Max [i]是k的最大值[k] = i。这可以通过向后迭代A在O(n)时间内完成。
  2. 构建数组Min,其中Min [i]是k <= i的A [k]的最小值。再次O(n)。
  3. 通过Max和Min迭代找到最大化Max [i] -Min [i]的索引i。也是O(n)。
  4. 返回(Min [i],Max [i])。
  5. 在编辑时:有一个角落情况,其中数组按反向排序顺序,在这种情况下,对于所有i,Max [i] = Min [i] = A [i]。这可以在O(n)时间内检测到,在这种情况下,您只需返回最大化A [i + 1] -A [i](将为负数)的相邻元素对。