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)。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP