题目背景
小8同学最近迷上了一个数组游戏,他有一个神奇的数组 a,通过这个数组,他可以构造出一个新的数组 b。这个构造过程有点像魔法,比如 a = [2, 3, 1],那么 b 就会变成 [1, 1, 2, 2, 2, 3]。具体来说,a[i] 表示在 b 中有 a[i] 个 i+1。
任务目标
小8的任务是计算数组 b 中所有连续子数组的极差之和。极差是什么呢?简单来说,就是一个子数组中最大值和最小值的差。比如子数组 [1, 1, 2] 的极差就是 2 - 1 = 1。
解题思路
-
构造数组
b:- 首先,我们需要根据数组
a构造出数组b。这个过程就像是在做拼图,把a中的每个元素按照规则拼接到b中。
- 首先,我们需要根据数组
-
计算极差之和:
- 接下来,我们要计算数组
b中所有可能的子数组的极差之和。这个过程有点像是在玩“找茬”游戏,只不过我们要找的是每个子数组的最大值和最小值的差。
- 接下来,我们要计算数组
代码实现
让我们来看看具体的代码实现,这就像是在编写一个魔法咒语,让计算机帮我们完成任务。
def solution(n: int, a: list) -> int:
MOD = 10**9 + 7
# Step 1: Construct array b
b = []
for i in range(n):
b.extend([i + 1] * a[i])
# Step 2: Calculate the sum of ranges of all subarrays
total_sum = 0
length = len(b)
for i in range(length):
max_val = b[i]
min_val = b[i]
for j in range(i, length):
max_val = max(max_val, b[j])
min_val = min(min_val, b[j])
total_sum = (total_sum + (max_val - min_val)) % MOD
return total_sum
if __name__ == '__main__':
print(solution(2, [2, 1]) == 2)
print(solution(3, [1, 2, 1]) == 6)
print(solution(4, [2, 3, 1, 1]) == 26)
代码解析
-
构造数组
b:- 我们用一个循环遍历数组
a,把每个元素i+1重复a[i]次,添加到数组b中。
- 我们用一个循环遍历数组
-
计算极差之和:
- 我们用两个嵌套的循环来遍历所有可能的子数组。外层循环控制子数组的起始位置,内层循环控制子数组的结束位置。
- 对于每个子数组,我们计算其最大值和最小值,然后计算极差,并累加到
total_sum中。 - 最后,我们对
total_sum取模,确保结果不会太大。
测试样例
- 样例1:
n = 2, a = [2, 1],输出2。 - 样例2:
n = 3, a = [1, 2, 1],输出6。 - 样例3:
n = 4, a = [2, 3, 1, 1],输出26。
总结
通过这个魔法咒语(代码),我们成功地帮助小8计算出了数组 b 中所有连续子数组的极差之和。这个过程既有趣又充满挑战,就像是在玩一个数字拼图游戏。希望你能从这个解题过程中感受到编程的魅力!