📅  最后修改于: 2023-12-03 15:12:43.846000             🧑  作者: Mango
本篇文章主要介绍了GATE计算机科学考试2017年(Set 1)的第48章中涉及的相关知识点,如下所示。
一个长度为n的非空数组a,定义了一个子序列,里面的元素呈现单调递增或递减的状态。现在,定义子序列的“价值”为其长度加所有元素的和。例如,在整个数组中,子序列[5,3,2]的价值为3 + 5 + 3 + 2 = 13。现在,需要产生一个新的数组,包含从给定数组中得到子序列的所有价值,其长度范围是2到n(包括2和n)。你的任务是得到这个数组。
例如:
Input: 1 2 3 1 2
Output: 0 6 7 3 5
我们可以使用两个数组left和right,left用于存储从左到右的子序列的最大价值,right用于存储从右到左的子序列的最大价值。然后,我们计算每个子序列的价值,直到数组的长度。代码如下所示。
def find_values(arr):
n = len(arr)
left, right = [], []
left.append([-1, 0])
for i in range(1, n):
if arr[i] > arr[i - 1]:
left.append([i - 1, left[-1][1] + arr[i - 1]])
else:
left.append([-1, left[-1][1]])
right.append([-1, 0])
for i in range(n - 2, -1, -1):
if arr[i] > arr[i + 1]:
right.append([i + 1, right[-1][1] + arr[i + 1]])
else:
right.append([-1, right[-1][1]])
right = right[::-1]
values = [0] * (n - 1)
for i in range(2, n + 1):
if left[i - 1][0] != -1 and right[i - 2][0] != -1:
values[i - 2] = left[i - 1][1] + right[i - 2][1] + arr[i - 1] * (i - 2)
return [0] + values + [0]
本篇文章主要介绍了GATE计算机科学考试2017年(Set 1)的第48章中涉及到的子序列问题,并给出了解决方案和示例代码。