JS算法-乘积最大子数组

简介: JS算法-乘积最大子数组

题目


给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。


题解


我们这道题采用动态规划实现,我们利用一个二维数组dp记录当前位置之前的最大和最小乘积。具体来说,dp[i][0]表示以第i个数结尾的最小乘积,dp[i][1]表示以第i个数结尾的最大乘积,接下来讲解下实现思路,我们先声明一个 maxProduct 函数,然后函数中接受一个nums参数,然后在声明一个dp常量,值为nums参数长度的空值数组,然后使用循环,将当前dp常量中的每个值都变为二维数组默认值为[0,0],然后将dp[0][0]dp[0][1]都赋值为数组的第一个元素nums[0],并将max也初始化为nums[0],然后,从数组的第二个元素开始循环,更新dp[i][0]dp[i][1]。具体来说,dp[i][0]的值可以从以下三个来源中选出最小值:当前数nums[i],上一个数的最小乘积dp[i-1][0]*nums[i],上一个数的最大乘积dp[i-1][1]*nums[i]。同理,dp[i][1]的值可以从以上三个来源中选出最大值,每次更新完dp[i][0]dp[i][1]之后,将max更新为以下三个值的最大值:上一个数的最小乘积dp[i-1][0]*nums[i],上一个数的最大乘积dp[i-1][1]*nums[i],当前数nums[i]。这是因为最大乘积可能包含当前数,也可能不包含,所以需要比较三种情况,最后,函数返回max即为所求。

var maxProduct = function (nums) {
  const dp = new Array(nums.length).fill(null);
  for (let i = 0; i < dp.length; ++i) {
    dp[i] = [0, 0];
  }
  dp[0][0] = nums[0];
  dp[0][1] = nums[0];
  let max = nums[0];
  for (let i = 1; i < nums.length; ++i) {
    dp[i][0] = Math.min(nums[i], dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]);
    dp[i][1] = Math.max(nums[i], dp[i - 1][1] * nums[i], dp[i - 1][0] * nums[i]);
    max = Math.max(max, dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i], nums[i])
  }
  return max;
};
相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
41 0
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
39 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
34 2
|
2月前
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
27 3
|
2月前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
39 4
|
2月前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
42 1
|
2月前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
27 5
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
25 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
JavaScript 前端开发 索引
探索JavaScript数组:基础
探索JavaScript数组:基础
19 3
|
2月前
|
JavaScript 前端开发 索引
JS 删除数组元素( 5种方法 )
JS 删除数组元素( 5种方法 )
49 1