问题如下,我解决了问题,但是检查的时候有输入数据量大的测试用例,进行测试的时候需要满足12秒。
健康)状况
三角洲发电机
在数学中,符号 Δ 和 d 常用于表示两个值之间的差异。类似地,微分采用线性关系的变化比率(即 dy/dx)。这种方法可以多次应用以创建多个“级别”的变化率。(一个常见的例子是 x(位置)-> v(速度)-> a(加速度))。
今天我们将创建一个类似的概念。我们的函数 delta 将采用一个值序列和一个正整数级别,并返回一个具有原始值“差异”的序列。(这里的差异严格表示 b - a,例如 [1, 3, 2] => [2, -1])参数级别是差异的“级别”,例如加速度是差异的第二个“级别”位置。下面指定了输入和输出列表的具体编码。
下面的示例显示了相同输入的三个不同“级别”。
int[] input = new [] {1, 2, 4, 7, 11, 16, 22};
Delta(input, 1); // new [] {1, 2, 3, 4, 5, 6}
Delta(input, 2); // new [] {1, 1, 1, 1, 1}
Delta(input, 3); // new [] {0, 0, 0, 0}
我们不假设输入有任何“起始值”,因此每个后续级别的输出将比前一个级别短一个(如上所示)。如果提供了无限输入,那么输出也必须是无限的。输入/输出编码
输入和输出列表可以是任意的(可能是无限的)IEnumerable。可能性包括有限列表和可能的无限生成器对象,但任何 Enumerable 都必须被接受为输入并且可以被接受为输出。差异实现
Delta must work for lists of any int instance.
附加要求/注意事项:
delta must work for inputs which are infinite
values will always be valid, and will always produce consistent classes/types of object
level will always be valid, and 1 <= level <= 400
其他示例:
IEnumerable<int> Up() {
int a=0, b=1; while (true) { yield return a; (a, b) = (a + b, b + 3); }
}
Delta(Up(), 1).Take(10); // new[] {1,4,7,10,13,16,19,22,25,28}
这是我的代码:
public static IEnumerable<int> Delta(IEnumerable<int> enumerable, int n)
{
List<int> res = enumerable.ToList();
List<int> temp = new List<int>();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < res.Count - 1; j++)
{
temp.Add(res[j + 1] - res[j]);
}
res = temp.ToList();
temp.Clear();
}
return res;
}
请帮我优化。
n <= 400
,堆栈是儿童游戏,递归应该是一个非常有效的解决方案。yield return
和yield break
“迭代器”模式,并相应地熟悉IEnumerator
.这是另一种可能效率较低但更易于理解的解决方案