问题描述
小U有一个长度为 nn 的数组,她需要计算这个数组的总和 sum=a1+a2+...+ansum=a1+a2+...+an。小U可以使用一次魔法,将其中一个加号变成乘号,以使得最终的总和最大。
你需要帮小U找到这个最优的方案,计算出最大的可能总和。
解题思路
针对给定长度为 n 的数组 a,在只允许使用一次魔法(将数组中某一对相邻元素间的加号变为乘号)的情况下,找到能使数组元素总和最大的方案,并返回这个最大的可能总和。
-
函数定义与初始计算
def solution(n: int, a: list) -> int::定义了函数solution,它接受数组的长度n和数组a本身作为参数,并返回一个整数,表示经过操作后能得到的最大总和。original_sum = sum(a):首先计算数组a的原始总和,即按照正常的加法将数组中所有元素相加得到的值。这个值将作为后续比较的基础。max_sum = original_sum:初始化最大总和max_sum为原始总和original_sum。在后续遍历数组寻找更优方案的过程中,如果找到更大的总和,将会更新这个max_sum的值。
-
遍历数组寻找最优方案
for i in range(n - 1):通过循环遍历数组a中的每一对相邻元素。循环的范围是从0到n - 2,因为我们要考虑的是相邻元素,所以最后一个元素不需要单独与后面的元素进行这种操作(后面已经没有元素了)。new_sum = original_sum - a[i] - a[i + 1] + a[i] * a[i + 1]:对于每一对相邻元素a[i]和a[i + 1],这里尝试将它们之间的加号变成乘号来计算一个新的总和new_sum。计算方式是先从原始总和original_sum中减去这两个元素(因为原本是相加的,现在要改变运算方式,所以先去掉这部分相加的值),然后再加上这两个元素相乘的值(即按照改变后的运算方式添加新的值)。
-
更新最大总和
if new_sum > max_sum::将计算得到的新总和new_sum与当前的最大总和max_sum进行比较。如果新总和更大,说明找到了一个更优的方案,此时执行max_sum = new_sum,将最大总和更新为新得到的更大的值。
-
返回结果
return max_sum:在遍历完数组的所有相邻元素组合并完成比较更新后,返回最终得到的最大总和max_sum,这个值就是在只使用一次魔法将一个加号变成乘号的情况下,数组能得到的最大可能总和。
完整代码
def solution(n: int, a: list) -> int:
original_sum = sum(a)
max_sum = original_sum
for i in range(n - 1):
new_sum = original_sum - a[i] - a[i + 1] + a[i] * a[i + 1]
if new_sum > max_sum:
max_sum = new_sum
return max_sum
if __name__ == '__main__':
print(solution(6, [1, 1, 4, 5, 1, 4]) == 27)
print(solution(3, [2, 3, 5]) == 17)
测试样例
样例1:
输入:
n = 6, a = [1, 1, 4, 5, 1, 4]
输出:27
样例2:
输入:
n = 3, a = [2, 3, 5]
输出:17