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;
};
相关文章
|
1天前
|
存储 算法
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(下)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
5 0
|
1天前
|
存储 算法 C语言
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(上)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
17 2
|
1天前
|
前端开发 JavaScript
前端 js 经典:数组常用方法总结
前端 js 经典:数组常用方法总结
11 0
|
3天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
6天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
6天前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
19 0
|
6天前
|
JavaScript
通过使用online表单的获取使用,了解vue.js数组的常用操作
通过使用online表单的获取使用,了解vue.js数组的常用操作
|
6天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
12 0
|
6天前
|
存储 JavaScript 前端开发
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
9 0
|
6天前
|
JavaScript 前端开发
js关于数组的方法
js关于数组的方法
11 0