codility MaxDistanceMonotonic,我的解决方案有什么问题

时间:2015-03-11 13:06:44

标签: c++ algorithm

问题:

给出了由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;
}

我的结果是这样的,我上次测试的答案出了什么问题:

enter image description here

1 个答案:

答案 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