假设我有一组随机实数,我如何将(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)
。有人建议如何划分问题空间吗?
答案 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.在那里你得到了最大间隔。