小B的极差之和 | 豆包MarsCode AI刷题

98 阅读2分钟

题目背景

小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

解题思路

  1. 构造数组 b

    • 首先,我们需要根据数组 a 构造出数组 b。这个过程就像是在做拼图,把 a 中的每个元素按照规则拼接到 b 中。
  2. 计算极差之和

    • 接下来,我们要计算数组 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)

代码解析

  1. 构造数组 b

    • 我们用一个循环遍历数组 a,把每个元素 i+1 重复 a[i] 次,添加到数组 b 中。
  2. 计算极差之和

    • 我们用两个嵌套的循环来遍历所有可能的子数组。外层循环控制子数组的起始位置,内层循环控制子数组的结束位置。
    • 对于每个子数组,我们计算其最大值和最小值,然后计算极差,并累加到 total_sum 中。
    • 最后,我们对 total_sum 取模,确保结果不会太大。

测试样例

  • 样例1n = 2, a = [2, 1],输出 2
  • 样例2n = 3, a = [1, 2, 1],输出 6
  • 样例3n = 4, a = [2, 3, 1, 1],输出 26

总结

通过这个魔法咒语(代码),我们成功地帮助小8计算出了数组 b 中所有连续子数组的极差之和。这个过程既有趣又充满挑战,就像是在玩一个数字拼图游戏。希望你能从这个解题过程中感受到编程的魅力!