📅  最后修改于: 2023-12-03 14:49:20.557000             🧑  作者: Mango
在程序设计中,我们经常面临构造序列的是要求,其中一种经典的问题是从N个连续整数的给定频率构造一个序列,单位相邻差。
给定n个整数 a1, a2, ..., an 和正整数 d1, d2, ..., dn,构造一个序列 A,满足 A[i+1] - A[i] = di (1 ≤ i ≤ n-1)。如果不存在这样的序列,则返回空序列。
对于本问题,我们可以用数学归纳法证明存在性。假设对于 i < n,都能构造出 { A[1], A[2], ..., A[i] },则构造出 A[i+1] 的方法为:
代码实现如下:
def make_sequence(n, ds):
if n <= 0 or not all(d > 0 for d in ds):
return []
A = [0] * n
A[0] = 0
for i in range(1, n):
if A[i-1] + ds[i-1] <= max(A[i-1], ds[i-1]):
A[i] = A[i-1] + ds[i-1]
elif 2*A[i-1] - A[i-2] - ds[i-2] <= max(A[i-1], ds[i-1]):
A[i] = 2*A[i-1] - A[i-2] - ds[i-2]
else:
return []
return A
>>> make_sequence(4, [2, 3, 4, 5])
[0, 2, 5, 9]
>>> make_sequence(3, [1, 1, 1])
[0, 1, 2]
>>> make_sequence(1, [2])
[0]
>>> make_sequence(3, [1, 2, 3])
[]