【LeetCode】152. Maximum Product Subarray (Medium)
来源:互联网 发布:阿里云服务器介绍 编辑:程序博客网 时间:2024/05/22 09:45
【题目】
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
动态规划
参考Maximum Subarray那一题,考虑以nums[i]结尾的乘积最大的子数组。
都是整数乘积,所以每乘一个数,绝对值一定变大。
与和最大的连续子数组不同的是要考虑符号,最大和遇到负数只可能最后的和,最大乘积中的负数如果能够抵消负号可以使乘积变大,所以考虑最大的绝对值。
dp[i].first表示以nums[i]为结尾的最大的正数积,dp[i].second表示以nums[i]为结尾的最小负数积。
如果没有最大正数积或者最小负数积,用0表示,最后的最大积应该是从dp[i].first中产生。
唯一的例外就是数组中只有一个负数的情况,特殊判断一下就可以。
class Solution {public: int maxProduct(vector<int>& nums) { int n = nums.size(); if (n == 1) return nums[0]; vector<pair<int, int>> dp(n); dp[0] = nums[0] > 0 ? make_pair(nums[0], 0) : make_pair(0, nums[0]); for (int i = 1; i < n; i++) { if (nums[i] > 0) { dp[i].first = dp[i - 1].first > 0 ? dp[i - 1].first * nums[i] : nums[i]; dp[i].second = dp[i - 1].second * nums[i]; } else { dp[i].first = dp[i - 1].second * nums[i]; dp[i].second = dp[i - 1].first > 0 ? dp[i - 1].first * nums[i] : nums[i]; } } int m = dp[0].first; for (int i = 0; i < n; i++) if (dp[i].first > m) m = dp[i].first; return m; }};
0 0
- Leetcode 152. Maximum Product Subarray (Medium) (cpp)
- 【LeetCode】152. Maximum Product Subarray (Medium)
- 152. Maximum Product Subarray -Medium
- 152. Maximum Product Subarray Medium
- [Leetcode 152, Medium] Maximum Product Subarray
- [Medium]Maximum Product Subarray
- 【Leet Code】152. Maximum Product Subarray---Medium
- LeetCode 152. Maximum Product Subarray
- [leetcode] 152.Maximum Product Subarray
- [LeetCode]152. Maximum Product Subarray
- leetcode:152. Maximum Product Subarray
- leetcode 152. Maximum Product Subarray
- 152. Maximum Product Subarray LeetCode
- [leetcode] 152. Maximum Product Subarray
- LeetCode *** 152. Maximum Product Subarray
- LeetCode 152. Maximum Product Subarray
- leetcode.152. Maximum Product Subarray
- LeetCode-152.Maximum Product Subarray
- JSON文件解析类下的数据引用问题及解决方法
- 一些常见数列的生成函数推导
- AspectJ 切面获取方法参数并拿到具体的值
- 成为Java顶尖高手要看的11本书
- Makefile经典教程
- 【LeetCode】152. Maximum Product Subarray (Medium)
- Android OpenGLES2.0(十一)——利用OpenGLES做Camera预览
- Demo04__long型
- ffmpeg入门以及使用总结
- Android中的五大数据存储方式之一——文件存储
- Python 按平均持仓市值调仓
- XZ_HTML之网页的组成
- 新浪博客插入代码块及代码高亮模板
- 新浪博客插入代码(块)及代码高亮…