找到随机数组的最大增量

时间:2010-10-04 02:17:30

标签: algorithm

假设我有一组随机实数,我如何将(i, j)j<i

对齐 maximise (a[j] - a[i])时间内

O(n ln(n))

n ln n sugenst递归。所以我想在n nn n sort中排序数组。但是,排序数组的min和mix可能不满足j<i

差异a[j]-a[i]取决于所有i,j,因此扫描所有可能的排列为O(n^2)。有人建议如何划分问题空间吗?

3 个答案:

答案 0 :(得分:5)

如果我理解正确,您希望在max(a[j] - a[i])所有(i, j)对中找到j < i

你可以在O(n)中做到这一点没有太多问题。

对于每个索引i,为了最大化a[j] - a[i]表达式,我们需要在区间max(a[j])上找到[0 .. i - 1]。所以,让我们从左向右移动(增加i)并保持当前最大值a[j]

int maxa = a[0];
for (int i = 1; i < n; ++i) {
    int current = maxa - a[i];
    if (current > best) {
        best = current;
    }
    maxa = max(maxa, a[i]);
}

答案 1 :(得分:0)

对数组进行排序,但要跟踪每个元素的原始位置。然后从两端开始扫描阵列并朝中间方向前进,直到找到最初顺序正确的一对。

答案 2 :(得分:0)

我不懂Nikitas解决方案。我没有看到'j'而是'n'。外环丢失了吗?

对于10个值的数组,它会产生9个差异,然后是8,7,6,...到1;对?

我的解决方案是:

int a[] = {9, 3, 5, 2, 7, 4, 6, 8, 0, 1};
// find starting point (3)
int start = 0;
for (; start < a.length -1 && a[start] > a[start+1];)
    ++start;
// find upper bound (8)
int upper = start; 
for (int j = start + 1; j < a.length; ++j)  
{
    if (a[j] > a[upper])
        upper = j;
}
// find lower bound (2)
int lower = start;
for (int l = lower; l < upper; ++l)
{
    if (a[l] < a[lower])
        lower = l;
}
System.out.println ("from:\t" + a[lower] + " to: " + a[upper]);

在prosa中:你搜索一个起点,在例子中不是9,因为右边没有更大的值,但是3是。

从3开始搜索最大值到右边,即8。

在3到8之间,低于3的最小值是2.在那里你得到了最大间隔。