给定数组所有旋转中 i*arr[i] 的最大和的 JavaScript 程序
在本文中,我们将实现一个 JavaScript 程序,用于计算给定数组所有旋转中 i*arr[i] 的最大和。这里 i*arr[i] 表达式表示我们必须通过将数组的所有元素与其当前位置相乘,然后求和来最大化数组元素的和。我们可以将给定数组元素向左或向右旋转以获得最大值。对于这个问题,我们将看到完整的代码和深入的解释。
问题介绍
在这个问题中,我们得到一个数组,如果我们将所有元素乘以它们各自的索引号,然后将所有结果相加,就会得到一个数字。通过一次旋转,我们可以将最左或最右的元素移动到数组的另一侧,这会导致每个元素的索引发生变化,我们可以进行任意次数的旋转(但是当旋转次数等于数组长度时,我们将得到与第一个数组相同的数组),通过旋转数组,我们可以改变元素的索引,从而改变 i*arr[i] 的和。
我们将尝试使用两种方法来最大化总和,首先,让我们看一个例子:
Given array: 1 3 2 4 2 0th rotation sum: 1*0 + 3*1 + 2*2 + 4*3 + 2*4 = 27 1st rotation sum: 2*0 + 1*1 + 3*2 + 2*3 + 4*4 = 29 2nd rotation sum: 4*0 + 2*1 + 1*2 + 3*3 + 2*4 = 21 3rd rotation sum: 2*0 + 4*1 + 2*2 + 1*3 + 3*4 = 23 4th rotation sum: 3*0 + 2*1 + 4*2 + 2*3 + 1*4 = 20
我们可以看到,在第一次旋转中,我们得到了最高的和,即 29。
方法
我们可以实现两种方法来找到所需的和,让我们来看看这两种方法:
第一种方法是朴素方法,它将在 O(N) 时间内找到数组的所有旋转,并且对于每次旋转,它将在 O(N) 时间内遍历数组找到所有元素的和,无需使用任何额外空间。
示例
// function to find the maximum rotation sum function maxSum(arr){ var len = arr.length var ans = -10000000000 // variable to store the answer // for loop to find all the rotations of the array for(var i = 0; i < len; i++) { var cur_sum = 0; for(var j = 0; j <len ;j++) { cur_sum += j*arr[j]; } if(ans < cur_sum){ ans = cur_sum; } var temp = arr[len-1]; var temp2 for(var j=0; j<len; j++){ temp2 = arr[j]; arr[j] = temp; temp = temp2 } } console.log("The required maximum sum is: " + ans) } // defining the array arr = [1, 3, 2, 4, 2] maxSum(arr)
时间和空间复杂度
上述代码的时间复杂度为 O(N*N),其中 N 是数组的大小,空间复杂度为 O(1)。
在每次迭代中,我们只有一个关于最后一个元素的单一因子差异,因为它的因子将从数组长度 - 1 更新为 0,对于其他元素,将添加一个额外的因子。所以我们可以编写如下代码:
示例
// function to find the maximum rotation sum function maxSum(arr){ var len = arr.length var ans = -10000000000 // variable to store the answer // for loop to find all the rotations of the array var total_sum = 0; for (var i=0; i<len; i++){ total_sum += arr[i]; } var cur_val = 0; for (var i=0; i<len; i++){ cur_val += i*arr[i]; } // Initialize result var ans = cur_val; // Compute values for other iterations for (var i=1; i<len; i++) { var val = cur_val - (total_sum - arr[i-1]) + arr[i-1] * (len-1); cur_val = val; if(ans < val) { ans = val } } console.log("The required maximum sum is: " + ans) } // defining the array arr = [1, 3, 2, 4, 2] maxSum(arr)
时间和空间复杂度
上述代码的时间复杂度为 O(N),其中 N 是数组的大小,空间复杂度为 O(1)。与先前的方法相比,这种方法更好。
结论
在本教程中,我们实现了 JavaScript 程序,用于计算给定数组所有旋转中 i*arr[i] 的最大和。我们看到了两种方法,一种是找到给定数组的所有旋转,然后比较它们针对表达式 i*arr[i] 的结果。在第二种方法中,我们通过使用数学方法将时间复杂度从 O(N*N) 提高到了 O(N)。