繁体   English   中英

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

[英]How to find the maximum span of a given array of numbers?

我要解决的问题如下:我想在给定的数组中找到最大的数字范围,该数组的给定数组A由正整数和负整数组成,返回最大(A [j]-A [i] ),这样1 <= i <j <= n,我针对这个问题提出了以下nlogn时间算法-

  1. 找到数组的n阶统计量的索引,使其为“ i”
  2. 查找数组的一阶统计量的索引,使其为“ j”
  3. 如果i> j,则返回差值,因为我们找到了数组的最大和最小元素之间的差,因此终止返回差值。
  4. 如果j> i然后将数组分成两半,并通过递归调用此算法,则找到两半的最大跨度,即A [1 .... i]和A [i + 1 ...... n],当算法找到这样的对i,j时,它将返回这些对之间的差,否则它将继续递归并最终终止。
  5. 返回最大值{subarray 1的max_span,subarray2的max_span}

这个算法是O(nlogn),但我不知道它是否正确。

@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;

这是一个O(n)算法。

  1. 建立一个数组Max,其中对于k> = i,Max [i]是A [k]的最大值。 通过向后迭代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])。

编辑时:存在一个极端情况,即数组以相反的顺序排列,在这种情况下,所有i的Max [i] = Min [i] = A [i]。 这可以在O(n)时间中检测到,在这种情况下,您只需返回使A [i + 1] -A [i]最大化(将为负)的一对相邻元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM