【发布时间】:2014-05-31 13:14:35
【问题描述】:
我刚刚在 Codility,遇到了一个任务,我无法找到目标 O(n) 效率的解决方案;我的解决方案运行时间为 O(n2)。如果有人能给我一个关于如何让它运行得更快的提示,我会非常高兴。这是任务。
给定一个由 N 个整数组成的非空零索引数组 A。
单调对是一对整数 (P, Q),满足 0 ≤ P ≤ Q
目标是找到索引相距最远的 monotonic_pair。更准确地说,我们应该最大化 Q - P 的值。只要找到距离就足够了。
例如,考虑数组 A,这样:
A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2
有十一个单调对:(0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5)。最大距离为 3,在 (1, 4) 对中。
写一个函数:
类解决方案 { public int solution(int[] A); }
给定一个由 N 个整数组成的非空零索引数组 A,返回任何 monotonic_pairs 中的最大距离。
例如,给定:
A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2
该函数应返回 3,如上所述。
假设:
N 是 [1..300,000] 范围内的整数; 数组 A 的每个元素都是 [−1,000,000,000..1,000,000,000] 范围内的整数。 复杂性:
预期的最坏情况时间复杂度为 O(N); 预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储)。 可以修改输入数组的元素。
我的第一个想法解决方案(在 O(n2) 中运行):
public static int solution(int[] A) {
int max = 0;
for(int i=0; i<A.length-1; i++) {
for(int j=i+1; j<A.length; j++) {
if(A[j] >= A[i] &&
(j - i) >= max) {
max = j - i;
}
}
}
return max;
}
【问题讨论】:
-
可以使用此处描述的相同想法:stackoverflow.com/questions/22233018/…
-
算法也是一样的:(