算法code优化:查找Equilibirum:查找数组的索引,使得其preFIX总和等于其后缀总和 [英] Algorithm Code Optimization: Find the Equilibirum: Find an index in an array such that its prefix sum equals its suffix sum

查看:240
本文介绍了算法code优化:查找Equilibirum:查找数组的索引,使得其preFIX总和等于其后缀总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的任务描述:

一个零索引数组A由N个整数的给出。

A zero-indexed array A consisting of N integers is given.

此阵的平衡指数为任何整数p 0≤P< N和较低的指数的元素的总和等于较高指数,即元素的总和
A [0] + A 1 + ... + A [P-1] = A [P + 1] + ... + A [N-2] + A [N-1]。

An equilibrium index of this array is any integer P such that 0 ≤ P < N and the sum of elements of lower indices is equal to the sum of elements of higher indices, i.e. A[0] + A1 + ... + A[P−1] = A[P+1] + ... + A[N−2] + A[N−1].

零元素的总和被假定为等于0。这可能发生,如果P = 0,或者如果P = N-1。
例如,请考虑以下数组A由N = 8的元素:

Sum of zero elements is assumed to be equal to 0. This can happen if P = 0 or if P = N−1. For example, consider the following array A consisting of N = 8 elements:

A[0] = -1
A[1] =  3
A[2] = -4
A[3] =  5
A[4] =  1
A[5] = -6
A[6] =  2
A[7] =  1

P = 1 is an equilibrium index of this array, because:
•   A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7]
P = 3 is an equilibrium index of this array, because:
•   A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7]
P = 7 is also an equilibrium index, because:
•   A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0

和有与指数大于7的任何元素。
    P = 8不是平衡索引,因为它不符合条件0≤P&下; ñ。

and there are no elements with indices greater than 7. P = 8 is not an equilibrium index, because it does not fulfill the condition 0 ≤ P < N.

写一个函数:
INT溶液(NSMutableArray的* A);
,给定一个零索引数组A由N个整数的,任何返回其平衡指数。

Write a function: int solution(NSMutableArray *A); that, given a zero-indexed array A consisting of N integers, returns any of its equilibrium indices.

函数应该返回-1,如果没有平衡指数存在。
例如,给定阵列上方A中所示,函数可以返回1,3或7,如上所述

The function should return −1 if no equilibrium index exists. For example, given array A shown above, the function may return 1, 3 or 7, as explained above.

假设:
    •N是范围[0..100,000]内的整数;
    •数组A中的每个元素在该范围内的整数。[-2,147,483,648..2,147,483,647]

Assume that: • N is an integer within the range [0..100,000]; • each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].

复杂性:
    •预计最坏情况下的时间复杂度为O(N);
    •预计最坏情况下的空间复杂度为O(N),超越输入存储(不包括对输入参数所需的存储空间)。

Complexity: • expected worst-case time complexity is O(N); • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

输入数组的元素可以被修改。

Elements of input arrays can be modified.

这是我的目标C的问题解决方法:

Here's my Solution for the problem in Objective C:

-(int)solution:(NSArray *) A{
for (int i=0; i<A.count; i++) {

    NSUInteger backwardsTotal = 0;
    if (i > 0) {
        for (int k=0; k<i; k++) {
            NSNumber *kValue = A[k];
            backwardsTotal += kValue.intValue;
        }
    }

    NSUInteger forwardTotal = 0;
    for (int j=i+1; j<A.count; j++) {
        NSNumber *jValue = A[j];
        forwardTotal += jValue.intValue;
    }

    if (backwardsTotal == forwardTotal) {
        return i;
    }
}

return -1;
}

如何优化这一解决方案?

How can i optimise this solution?

该方法,在每@Nikki评论的变化:

Changes made to the method as per @Nikki comments:

-(int)solution:(NSArray *) A{
NSUInteger a = 0, b = 0;

for (int i=0; i<A.count; i++) {
    NSNumber *iValue = A[i];
    b += iValue.intValue;
}
NSLog(@"Total: b: %ld", b);

for (int k=0; k<A.count; k++) {
    NSNumber *kValue = A[k];
    b -= kValue.intValue;

    NSLog(@"b: %ld", b);
    NSLog(@"a: %ld", a);

    if (a == b)
        return k;

    a += kValue.intValue;

}

return -1;
}

我测试上述code如下:

I am testing the above code as follows:

//    NSArray *array = @[@"-3", @"0", @"3"];
NSArray *array = @[@"-2", @"4", @"-5", @"6", @"1", @"-6", @"2", @"1"];
NSUInteger one = [self solution:array];
NSLog(@"one: %ld", one);//returns 7

解决方案似乎更好地工作。
但是,它仍然是不完美的,并且使用O(N ** 2)的时间复杂度。
而且还有其他性能测试超时错误。

The solution seems to work better. But still, it is not perfect and uses O(N**2) time complexity. And also there are Timeout errors in other Performance tests.

下面截图:

Test1的性能

性能的Test2

性能Test3的

这能仍然优化?

推荐答案

您当前的解决方案是O(n ^ 2)操作(您总结全阵列式n次)。

Your current solution is O(n^2) operations (You sum the whole array n times).

您可以在任何点上,a和b仅2变量设定为零和b到阵列的总和。随后,遍历所有的指标。当通过迭代指数I,首先做B - =改编[1]。然后,如果一个== B,返回岛然后做一个+ =改编[1]。那是O(n)的操作,更加高效。

You could have just 2 variables at any point, a and b, setting a to zero and b to the sum of the array. Afterwards, iterate over all of the indices. When iterating over index i, first do b -= arr[i]. Then, if a==b, return i. Then do a += arr[i]. That is O(n) operations, much more efficient.

这篇关于算法code优化:查找Equilibirum:查找数组的索引,使得其preFIX总和等于其后缀总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆