【问题标题】:codility MaxDistanceMonotonic, what's wrong with my solutioncodility MaxDistanceMonotonic,我的解决方案有什么问题
【发布时间】:2015-03-11 13:06:44
【问题描述】:

问题:

给出了一个由 N 个整数组成的非空零索引数组 A。 单调对是一对整数 (P, Q),满足 0 ≤ P ≤ Q

目标是找到其索引相距最远的单调对。更准确地说,我们应该最大化 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) 对中。

写一个函数:

int 解(向量 &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;
}

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

【问题讨论】:

  • 也许你已经知道这一点,但它可能是某处的数字溢出。
  • @Simon 我用过long int
  • 那么使用long long。
  • 请将问题本身添加到您的问题正文中,不要依赖链接(这往往会死)
  • @amit 问题已添加。

标签: c++ algorithm


【解决方案1】:

如果你有:

0  1 2  3  4  5
31 2 10 11 12 30

您的算法输出3,但正确答案是4 = 5 - 1

发生这种情况是因为您的 min 在内部 while 循环的第一次完整运行时变为 -1,因此 (1, 5) 对将永远没有机会被检查,max4 开始时进入嵌套的whiles。

请注意,问题描述需要O(n) 额外存储空间,而您使用O(1)。我认为O(1) 额外存储和O(n) 时间无法解决问题。

我建议您重新考虑您的方法。如果放弃,有官方解决方案here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多