问题:
给出了由N个整数组成的非空零索引数组A. 单调对是一对整数(P,Q),使得0≤P≤Q<1。 N和A [P]≤A[Q]。
目标是找到指数相距最远的单调对。更确切地说,我们应该最大化Q-P值。仅找到距离就足够了。
例如,考虑数组A:
A[0] = 5
A[1] = 3
A[2] = 6
A[3] = 3
A[4] = 4
A[5] = 2
有11个单调对:(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)。
写一个函数:
int solution(vector&amp; A);
给定N个整数的非空零索引数组A,返回任何单调对中的最大距离。
例如,给定:
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),超出输入存储(不计入输入参数所需的存储)。 可以修改输入数组的元素。
以下是MaxDistanceMonotonic的解决方案:
int solution(vector<int> &A) {
long int result;
long int max = A.size() - 1;
long int min = 0;
while(A.at(max) < A.at(min)){
max--;
min++;
}
result = max - min;
while(max < (long int)A.size()){
while(min >= 0){
if(A.at(max) >= A.at(min) && max - min > result){
result = max - min;
}
min--;
}
max++;
}
return result;
}
我的结果是这样的,我上次测试的答案出了什么问题:
答案 0 :(得分:0)
如果你有:
0 1 2 3 4 5
31 2 10 11 12 30
您的算法会输出3
,但正确答案为4 = 5 - 1
。
这是因为你的min
在内部while循环的第一次完整运行时变为-1,因此(1, 5)
对永远不会有机会被检查,max
开始在输入嵌套的时间时在4
出来。
请注意,当您使用O(n)
时,问题描述需要O(1)
额外存储空间。我认为用O(1)
额外存储和O(n)
时间来解决问题是不可能的。
我建议你重新考虑一下你的做法。如果你放弃,有一个官方解决方案here。