JavaScript 在给定数组的所有旋转中找到i*arr[i]的最大和

JavaScript 在给定数组的所有旋转中找到i*arr[i]的最大和

在本文中,我们将实现JavaScript程序,用于在给定数组的所有旋转中找到iarr[i]的最大和。这里的iarr[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)的时间内找到数组的所有旋转,并对每个旋转遍历数组以找到所有元素的和,不使用任何额外的空间。

示例

// 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)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程