小U的加法魔法
问题描述:
小U有一个长度为 nn 的数组,她需要计算这个数组的总和 sum=a1+a2+...+ansum=a1+a2+...+an。小U可以使用一次魔法,将其中一个加号变成乘号,以使得最终的总和最大。
你需要帮小U找到这个最优的方案,计算出最大的可能总和。
思路解析:
思路一
最初我以为是可以不按照原先数组顺序,所以我尝试先将数组按照从大到小排序,最后第一项与第二项相乘之后再与其他数字相加。
public class Main {
public static int solution(int n, int[] a) {
// 排序数组
Arrays.sort(a);
// 反转数组,使其从大到小排列
for (int i = 0; i < n / 2; i++) {
int temp = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = temp;
}
// 计算新的总和
int sum = a[0] * a[1];
for (int i = 2; i < n; i++) {
sum += a[i];
}
// 返回总和
return sum;
}
public static void main(String[] args) {
System.out.println(solution(6, new int[]{1, 1, 4, 5, 1, 4}) == 27);
System.out.println(solution(3, new int[]{2, 3, 5}) == 17);
}
}
运行结果
示例显示正确,因为示例中的大数字都是相邻的,所以结果并没有出现误差,但当我提交时却显示错误,并且显示我的运行结果大于正确结果,所以我意识到原来数组顺序是不可以改变的。
思路二
我们可以先计算出不使用乘法的情况,之后再遍历每一种使用乘法的情况与之对比找出最大值。 所以我们先计算数组之和:
for (int num : a) {
sum += num;
}
再遍历数组所有乘法情况
for (int i = 0; i < n - 1; i++) {
int newSum = sum - a[i] - a[i + 1] + a[i] * a[i + 1];
// 更新最大值
if (newSum > maxSum) {
maxSum = newSum;
}
}
最后return maxSum;
运行结果
这次示例和提交都正确。