如何使性能O(N)代替O(N ^ 2)?

时间:2015-11-19 18:19:06

标签: objective-c asymptotic-complexity

我试图了解如何更好地解决此问题的时间复杂性:

  

给出了由N个整数组成的非空零索引数组A.   阵列A的连续元素代表a上的连续汽车   路。

     

数组A仅包含0和/或1:0表示向东行驶的汽车,1表示向西行驶的汽车。

     

目标是计算过往车辆的数量。我们说一对车(P,Q),   其中0≤P< Q&lt;当P向东行驶时,N正在经过   正在往西走。

     

例如,考虑数组A:

A[0] = 0   
A[1] = 1   
A[2] = 0   
A[3] = 1   
A[4] = 1 
     

我们有五对过往车辆:(0,1),(0,3),(0,4),(2,3),(2,4)。

     

写一个函数:

int solution(NSMutableArray *A);
     

给定N个整数的非空零索引数组A,返回   过往车辆的数量。

     

如果过往车辆对的数量,该函数应返回-1   超过1,000,000,000。

     

假设:

     

N是[1..100,000]范围内的整数;数组A的每个元素   是一个整数,可以具有以下值之一:0,1。

     

复杂度:

     

预期的最坏情况时间复杂度为O(N);预期的最坏情况空间   复杂度是O(1),超出了输入存储(不包括存储   输入参数需要)。输入数组的元素可以是   修改。

解决方案:

   int solution(NSMutableArray *A) {
// write your code in Objective-C 2.0

int counter = 0;

for (int i = 0; i < A.count; i++) {
    if ([A[i] intValue] == 0) {
        for (int j = i; j < A.count; j++) {
            if ([A[j] intValue] == 1) {
                counter++;
            }
        }
    }
}


return counter;
}

由于嵌套的for循环,此时解决方案正在O(N ^ 2)运行。我似乎无法绕过如何在O(N)时间解决它。这不是家庭作业;我只是刷新采访算法。

1 个答案:

答案 0 :(得分:2)

那样的东西?

NSInteger solutionCountingDifferentDirections(NSMutableArray *A) {
    NSInteger multiplier = 1;
    NSInteger counter = 0;
    NSInteger firstCarDirection = A[0];
    for (NSInteger idx = 1; idx < A.count; idx++) {
        if (firstCarDirection == A[idx]) {
            multiplier++;
        }
        else {
            counter += multiplier;
        }
    }

    return counter;
}

修改 @RNar建议我们不计算西方方向的第一辆车,所以这是这种情况的解决方案:

NSInteger solutionCountingFromFirstEastDirection(NSMutableArray *A) {
    NSInteger multiplier = 0;
    NSInteger counter = 0;
    for (NSInteger idx = 0; idx < A.count; idx++) {
        if (A[idx] == 0) {
            multiplier++;
        }
        else {
            counter += multiplier;
        }
    }

    return counter;
}