给定大小为n的数组x,构造一个大小为n的数组y,其中yi = sum(a) - xi.
如何在O(n)中使用常量空间并且不使用减法运算符?我无法想出这个。没有按位运算可用于模拟减法。我知道这里的关键是通过使用一些数据结构来获得额外的常量空间,但是如何通过O(n)限制来完成呢?创建一个包含除xi
之外的所有组合之和的数组将需要O(n ^ 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))