题目描述:

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

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

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

该题目求最大子序列的乘积,参考leetcode-52 最大子序和中的暴力解法,穷举所有元素的可能性:

int maxSubArray(vector<int>& nums) {if(nums.size() == 1) return nums[0];int res = nums[0];for (int i = 1;i < nums.size(); ++i) {int pre = _maxSubArray(nums,i);res = max(res,pre);}return res;
}
int _maxSubArray(vector<int> &nums, int index) {if(index == 0) {return nums[0];}int pre = _maxSubArray(nums, index - 1);int res = max(nums[index] * pre, nums[index]);return res;
}

但是和的形态和积的形态还是有差异的,针对-2 2 -3的数列,以上方法求的最大乘积为2,但是实际上是12

乘积存在 之前的最小值(负数)再乘上当前的一个负数,就有可能变为最大值。

所以针对乘积的最大子序列,使用动态规划的方式,且状态转移方程需要维护两种状态,一种最大值,一种最小值:

  • dp_max[i] = max(dp_max[i - 1] * nums[i], dp_min[i - 1] * nums[i], nums[i])
  • dp_min[i] = min(dp_max[i-1] * nums[i], dp_min[i-1] * nums[i], nums[i])

实现如下:

int maxProduct(vector<int>& nums) {if(nums.size() == 1) return nums[0];int dp[2][2],res; //仅仅需要常数的空间,每个方程仅需要保存当前状态和前一个状态dp [0][0] = nums[0]; //最大值的方程dp [0][1] = nums[0]; //最小值的方程res = nums[0];for (int i = 1;i < nums.size(); ++i) {int x = i % 2; //转换下标int y = (i - 1) % 2;dp[x][0] = max(max(dp[y][0] * nums[i], dp[y][1] * nums[i]),nums[i]);dp[x][1] = min(min(dp[y][0] * nums[i], dp[y][1] * nums[i]),nums[i]);res = std::max(res, dp[x][0]);}return res;
}

leetcode-152 乘积最大子序列相关推荐

  1. Java实现 LeetCode 152 乘积最大子序列

    152. 乘积最大子序列 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] ...

  2. LeetCode 152. 乘积最大子序列(DP)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1:输入: [2,3,-2,4] 输出: 6 解 ...

  3. Leetcode 152. 乘积最大子序列 解题思路及C++实现

    解题思路: 求乘积最大的子序列,不同于和最大的子序列,两个负数相乘是会得到正数的,所以在遍历数组nums时,需要存储最大和最小的子序列乘积.然后每遍历一个元素,更新一次. class Solution ...

  4. leetcode 152 乘积最大子序列

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2 ...

  5. LeetCode 152. 乘积最大子序列(动态规划)

    题目描述 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...

  6. leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别

    这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶.先来看看两道算法题的简单描述. 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组 ...

  7. leetcode 算法-乘积最大子序列-152

    leetcode 算法-乘积最大子序列 leetcode 传送门 题目 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2, ...

  8. Leetcode 152.乘机最大子序列

    乘积最大子序列 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 ...

  9. 152. 乘积最大子序列

    链接:https://leetcode-cn.com/problems/maximum-product-subarray/ 题解:https://leetcode-cn.com/problems/ma ...

  10. 【Leetocde | 24 】152. 乘积最大子序列

    这道题最直接的方法就是用DP来做,而且要用两个dp数组,其中f[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最大子数组乘积,g[i]表示子数组[0, i]范围内并且一定包含nums ...

最新文章

  1. 福利 | 爱德华·阿什福德·李:人类与AI技术将是共生关系
  2. Nature:万物皆可“编程”,结构材料也能实现数据存储,华人科学家一作
  3. 使用java做paypal开发时购买东西支付不成功的原因
  4. 创业公司死亡公式:人越多死得越快!
  5. SAP生产订单预留(下)
  6. 【ABP杂烩】面向切面编程(AOP)知识总结
  7. (2/2)Canvas的交互存为图片-爬坑篇
  8. matplotlib数据可视化实战——折线图+散点图
  9. 时间管理专题_理论篇
  10. 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
  11. Jsoup进阶之获取指定数据
  12. 10a 16a 插座区别_10A和16A的插座能混用吗?
  13. HTML5重要知识点整理
  14. Arm汇编 位置无关代码 adr 指令
  15. [2018.07.26 T2] 背包问题
  16. 学校计算机网络管理员面试,网络管理员面试题及答案
  17. 抖音微博火山快手皮皮虾微视去水印附源码
  18. regeneratorRuntime is not defined
  19. 并行执行linux命令,如何使用Parallel在Shell中并行执行命令
  20. 弯道实现十万阅读,这个五月我太太太开心了

热门文章

  1. ios Develop mark
  2. TimeQuest学习之三------外部寄存器模型
  3. UML用例图概要(转)
  4. 算法设计与分析第5章 回溯法(一)【回溯法】
  5. Android横向伸缩,Android 实现伸缩布局效果示例代码
  6. python 微服务框架 知乎_序: 我需要一个什么样的微服务框架
  7. python求平方根的代码_Python求平方根(附带源码)
  8. 大学计算机课程改革项目,大学计算机课程改革.ppt
  9. php找不到phpmyadmin,nginx下找不到phpmyadmin文件
  10. java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行