我试图了解如何更好地解决此问题的时间复杂性:
给出了由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)时间解决它。这不是家庭作业;我只是刷新采访算法。
答案 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;
}