给定一个大小为 n 的数组 x,构造一个大小为 n 的数组 y,其中yi = sum(a) - xi.
如何在 O(n) 中使用常量空间而不使用减法运算符来完成此操作?我想不通这个。不能使用按位运算来模拟减法。我知道这里的关键是通过使用一些数据结构来增加额外的常量空间,但是如何通过 O(n) 限制来完成呢?制作一个包含所有组合总和的数组,除了xi
需要 O(n^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]);
}
禁止减法?
不要放弃!要机敏!:-)
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))