【发布时间】:2017-09-10 02:45:33
【问题描述】:
假设我们有一个正整数数组 A。我们的任务是找到最大可能的 i-j , i>j 具有以下性质:A[i]>=A[j]。
举个例子,如果
A[0]=78
A[1]=88
A[2]=64
A[3]=94
A[4]=17
A[5]=91
A[6]=57
A[7]=69
A[8]=38
A[9]=62
A[10]=13
A[11]=17
A[12]=35
A[13]=15
A[14]=20
A[15]=15
那么答案是 10 ,因为对于 i=14 和 j=4 , A[i]>A[j] 。
哪种算法最适合该任务?
到目前为止,我已经考虑了以下算法: 我申请 mergesort 。我使用变量 max 来存储最终答案。每当 A[i] 和 A[j] 没有交换时,我都会检查 i-j> max 。如果是这样,我会更新最大值。 时间复杂度:O(nlogn)。
有更好的算法吗?
【问题讨论】:
-
更好是什么意思?这是否意味着在时间或空间复杂度方面更快?这是否意味着更易于实现的算法?
-
既然 A[i] (91) >= A[j] (17) 并且 i > j,为什么答案 i=5 (91) 和 j=4 (17) 不是? .您是否需要索引或值方面的最大可能 i-j?
-
如果我们选择 i=5 和 j=4 ,那么 A[i] > A[j] 是真的。但是,我们将有 5-4=1 作为答案。如果我们选择 i=14 和 j=4 ,那么 A[i] > A[j] 也是正确的。在这种情况下,我们有 14-4=10 。我们需要找到最大的 i-j ,所以我们选择 i=14 和 j=4 ,答案是 10。
-
@user3697730 我不确定你的算法是正确的还是真的是 O(nlogn)。 ` 每当 A[i] 和 A[j] 没有交换时 ` 是什么意思?
-
@user3697730:这行不通。即使您保留有关元素原始位置的信息(以便实际计算 i-j 值),您也可能永远不会同时查看需要查看的 i 和 j。