JavaScript最大乘积子数组程序


子数组是由数组的一部分组成,通过移除数组的前缀或后缀元素(或不移除)形成。我们将尝试找到包含这些元素的子数组,并将它们全部相乘以获得最大值。我们将实现代码并进行解释。在这篇文章中,我们将实现一个用于最大乘积子数组的JavaScript程序。

问题介绍

在这个问题中,我们得到一个数组,我们需要从中挑选任何一个子数组,但问题是子数组的大小并不重要,重要的是子数组所有元素的乘积必须是所有子数组中最大的。

如果给定的数组只包含正数,那么结果将始终是相同的给定数组;如果存在任何零,则当前数组将在零处被划分为多个子数组分区,并且在所有这些分区中,位于边缘或零之间的子数组将是最重要的。

现在,第三种情况,如果数组还包含负数,那么问题是,如果有两个或偶数个负数,我们将得到正数结果;否则,在奇数个负数的情况下,我们将得到负数结果。

例如 -

情况1 - 全部为正数

Given array: 1 2 3 4 2 2 1 
Final answer: 96 

情况2 - 全部为非负数

Given array: 1 2 3 0 4 5 1 0 9 2 0 0 
Final answer: 20 by taking 4 5 1 as a subarray

这里我们得到了三个分区:1 2 3、4 5 1和9 2,在这三个分区中,中间一个分区是最大的。

情况3 - 所有整数

Given array: -40 -2 0 1 5 -9 -8 -6 0 9 8 3

Final answer: 360 by taking the 1 5 -9 -8, there are other subarrays with some high values but are less as compared to this

方法

我们可以通过两种方法运行此程序:第一种是朴素方法,首先找到给定数组的所有子数组,然后将所有数字相乘以找到最大的乘积。让我们看看它的代码 -

示例

// function to find the multiplication of the subarray
// with the largest result
function maxMulti(arr){
   var len = arr.length
   var ans = 0 // marking zero as the initial answer
   var cur = 1 // marking variable to get the current subarray multiplication

   // traversing over the array to get each subarray result
   for(var i = 0;i<len; i++) {
      cur = 1;
      for(var j = i; j<len ;j++){
         cur *= arr[j];
         if(ans < cur){
            ans = cur
         }
      }
   }
   console.log("The largest multiplication of subarray is: " + ans)
}

// definging the array's
arr1 = [1, 2, 3, 4, 2, 2, 1 ]
maxMulti(arr1)

// defining the second array
arr2 = [1, 2, 3, 0, 4, 5, 1, 0, 9, 2, 0, 0]
maxMulti(arr2)

// defining the third array
arr3 = [-40, -2, 0, 1, 5, -9, -8, -6, 0, 9, 8, 3]
maxMulti(arr3)

时间和空间复杂度

上述代码的时间复杂度为O(N*N),其中N是数组的长度,上述代码的空间复杂度为O(1)。

上述代码的时间复杂度不是很好,因为它可以更好,为此,我们将编写另一种方法,我们将使时间复杂度更好。

示例

在此代码中,我们将使用分区和数论的概念,让我们先看看代码

// function to find the multiplictaion of subarray
// with the largest result

function maxMulti(arr){
   var max_ending = 1;
   var min_ending = 1;
   var ans = 0;
   var temp= 0;
   var n = arr.length
   for(var i = 0; i < n; i++) {
      if (arr[i] > 0) {
         max_ending = max_ending * arr[i];
         if(1 < min_ending * arr[i]) {
            min_ending = 1
         }
         else
            min_ending = min_ending * arr[i]
         temp = 1;
      }
      else if (arr[i] == 0) {
         max_ending = 1;
         min_ending = 1;
      } else {
         var flag = max_ending;
         max_ending = min_ending * arr[i] > 1 ? min_ending * arr[i] : 1;
         min_ending = flag * arr[i];
      }
      
      // update max_so_far, if needed
      if (ans < max_ending)
      ans = max_ending;
   }
   if (temp == 0 && ans == 0){
      console.log("The largest multiplication of subarray is: " + 0)
   } else
   console.log("The largest multiplication of subarray is: " + ans)
}

// defining the array's
arr1 = [1, 2, 3, 4, 2, 2, 1 ]
maxMulti(arr1)

// defining the second array
arr2 = [1, 2, 3, 0, 4, 5, 1, 0, 9, 2, 0, 0]
maxMulti(arr2)

// defining the third array
arr3 = [-40, -2, 0, 1, 5, -9, -8, -6, 0, 9, 8, 3]
maxMulti(arr3)

时间和空间复杂度

上述代码的空间复杂度为O(1),因为我们在代码中没有使用任何额外的空间。我们正在遍历数组一次,这意味着总共有N次迭代,因此上述代码的时间复杂度为O(N)。

结论

在这篇文章中,我们实现了一个用于最大乘积子数组的JavaScript程序。子数组是由数组的一部分组成,通过移除数组的前缀或后缀元素(或不移除)形成。我们实现了两种方法,空间复杂度均为O(1),时间复杂度分别为O(N*N)和O(N)。

更新于: 2023年3月30日

283 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告