构造第二个数组算法

时间:2012-12-02 00:02:51

标签: arrays algorithm

给定大小为n的数组x,构造一个大小为n的数组y,其中yi = sum(a) - xi.

如何在O(n)中使用常量空间并且不使用减法运算符?我无法想出这个。没有按位运算可用于模拟减法。我知道这里的关键是通过使用一些数据结构来获得额外的常量空间,但是如何通过O(n)限制来完成呢?创建一个包含除xi之外的所有组合之和的数组将需要O(n ^ 2)。

2 个答案:

答案 0 :(得分:2)

所以,我们有数组x,我们必须创建数组y。让我们假设我们的数组x的大小为5(仅举例)。所以让我们写出y'数组的每个元素的值。

y[0] =      + x[1] + x[2] + x[3] + x[4];
y[1] = x[0] +      + x[2] + x[3] + x[4];
y[2] = x[0] + x[1] +      + x[3] + x[4];
y[3] = x[0] + x[1] + x[2]        + x[4];
y[4] = x[0] + x[1] + x[2] + x[3]       ;

你看到这条对角线吗?它将y分为左侧部分和右侧部分,其中yLeft的每个下一个元素是前一个yLeft元素和x数组的某个元素的总和。与y的右边部分相同的情况(刚刚颠倒)

代码,C#:

var x = new int[] { 4, 6, 2, 4, -2, 4, 0 };
var y = new int[x.Length];

y[0] = 0;
y[y.Length - 1] = 0;

var curYLeft = 0;
for ( int i = 1; i < x.Length; i++ ) {
    curYLeft += x[i - 1];
    y[i] = curYLeft;
}

var curYRight = 0;
for ( int i = x.Length - 1 - 1; i >= 0; i-- ) {
    curYRight += x[i + 1];
    y[i] += curYRight;
}

for ( int i = 0; i < x.Length; i++ ) {
    Console.WriteLine("{0} {1}", x.Sum() - x[i], y[i]);
}

答案 1 :(得分:2)

禁止减法?
不要放弃!机智! : - )

a-b = log(exp(a)/exp(b))
a-b = a+b*cos(pi)
a-b = sqrt(2*(a^2+b^2))*cos(atan(1)+atan2(b,a))