📅  最后修改于: 2023-12-03 15:06:37.911000             🧑  作者: Mango
在一些计算题目中,我们经常需要根据给定数组的某种规律,求解出一个原始的数组。例如,给定一个数组 arr,其中第 i 个元素是前 i 个元素的平均值,我们需要求解出原始的数组。
例如,给定数组 arr=[1, 2, 2.5, 3],则原始数组为 [1, 3, 2, 4]。
这种问题的求解可以采用数学方法,具体的做法请参考下文。
假设原始数组为 a,其长度为 n。根据题意,我们有下列等式成立:
a[1]=arr[1]
a[2]=(arr[1]+arr[2]*2)/3
a[3]=(arr[1]+arr[2]*2+arr[3]*3)/6
a[4]=(arr[1]+arr[2]*2+arr[3]*3+arr[4]*4)/10
.
.
.
a[n]=(arr[1]+arr[2]*2+...+arr[n]*n)/(1+2+...+n)
根据这个等式,我们可以依次求解出原始数组中的每一个元素。
下面是用 Python 实现求解原始数组的代码:
def findOriginalArray(arr: List[float]) -> List[float]:
n = len(arr)
if n % 2 != 0:
return []
arr = sorted(arr)
res = []
dic = {}
for num in arr:
if num * 2 in dic and dic[num * 2] > 0:
res.append(num)
dic[num * 2] -= 1
else:
if num not in dic:
dic[num] = 0
dic[num] += 1
if len(res) != n // 2:
return []
return res
返回值说明:
arr
:输入的数组,其中第 i 个元素是前 i 个元素的平均值。res
:求解出的原始数组。这段代码的时间复杂度为 O(nlogn),其中 n 是数组的长度。
排序的时间复杂度为 O(nlogn)。
求出原始数组的时间复杂度为 O(n)。
因此总的时间复杂度为 O(nlogn)。