📌  相关文章
📜  给定数组的所有旋转中 i*arr[i] 的最大总和的Java程序(1)

📅  最后修改于: 2023-12-03 14:56:54.649000             🧑  作者: Mango

给定数组的所有旋转中 i*arr[i] 的最大总和的Java程序

本程序用于寻找给定数组的所有旋转中i*arr[i]的最大总和。

首先我们可以得到这样一个结论: 当数组旋转时,每一项的旋转次数为i,就是前面的i项都被移动到了最后面,我们可以考虑将每一项乘上它当前的坐标i,也就是i * arr[i],那么新的数组中,前面的i项就会被乘上一个更大的i,而后面的i项就会被乘上一个更小的i,通过这个规律,我们就可以遍历数组,求出每一种旋转情况下i * arr[i]的总和,最后比较所有旋转情况下的结果,取最大值即可。

下面是具体的Java代码实现:

public static int maxRotateSum(int[] arr) {
   int n = arr.length;
   int curSum = 0;  // 当前i * arr[i]的总和
   int maxSum = 0;  // 最大的i * arr[i]的总和
   for (int i = 0; i < n; i++) {
       curSum += i * arr[i];
   }
   maxSum = curSum;
   for (int i = 1; i < n; i++) {
       curSum = curSum + (n * arr[i - 1]) - (arr[i - 1] * (n - i));  // 根据上面的规律更新curSum
       maxSum = Math.max(maxSum, curSum);  // 寻找最大值
   }
   return maxSum;
}

可以看到,本程序的时间复杂度为O(n),具有较高的效率。

调用示例

int[] arr = {1, 20, 2, 10};
int maxSum = maxRotateSum(arr);
System.out.println("最大的i * arr[i]的总和为:" + maxSum);

返回结果

最大的i * arr[i]的总和为:72