[LeetCode] Maximum Product Subarray 连续数列最大积
2014-12-06 15:01
423 查看
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array
the contiguous subarray
Hide Tags
Array Dynamic Programming
这个问题是给定一个数组,包括正负数和0,求连续子串数字最大的乘积,最容易动态规划,求出整个matrix<i,j> i-th 到 j-th 之间的数字之积,这样方法时间和空间都是O(n2),另一个比较技巧的方法,只需要O(n)时间和O(1)空间,考虑两个0 之间的数字:
如果a-h 之间的负数个数为偶数,那么结果就是a - h。
如果负数个数为奇数,假如为d, 那么考虑d 的左边,最大值为a-c,右边为e-h,因为两个部分中的负数个数为偶数。
这样在奇数情况下,只要d 去最靠近0的那个,便会有一部分是最大值。
这样只要从左遍历一次,再从右遍历一次便能找出。
逻辑:
判断输入个数。
设初始值,当前计算值curval = 1.
从左遍历数组。
如果遇到0,判断最大值(eg:-1,0,-2),curval =1,继续。
如果非0,那么curval 乘以该值,更新返回值。
从右遍历数组,重复4.5步,判断0就不要需要了。
View Code
官方解法中结合了求最小值的解答,是一个标准的dp 过程,
f(k) :0-th to k-th 的最大值
g(h):0-th to k-th 的最小值
那么有:
f(k) = max( f(k-1) * A[k], A[k], g(k-1) * A[k] )
g(k) = min( g(k-1) * A[k], A[k], f(k-1) * A[k] )
For example, given the array
[2,3,-2,4],
the contiguous subarray
[2,3]has the largest product =
6.
Hide Tags
Array Dynamic Programming
这个问题是给定一个数组,包括正负数和0,求连续子串数字最大的乘积,最容易动态规划,求出整个matrix<i,j> i-th 到 j-th 之间的数字之积,这样方法时间和空间都是O(n2),另一个比较技巧的方法,只需要O(n)时间和O(1)空间,考虑两个0 之间的数字:
0,a,b,c,d,e,f,g,h,0
如果a-h 之间的负数个数为偶数,那么结果就是a - h。
如果负数个数为奇数,假如为d, 那么考虑d 的左边,最大值为a-c,右边为e-h,因为两个部分中的负数个数为偶数。
这样在奇数情况下,只要d 去最靠近0的那个,便会有一部分是最大值。
这样只要从左遍历一次,再从右遍历一次便能找出。
逻辑:
判断输入个数。
设初始值,当前计算值curval = 1.
从左遍历数组。
如果遇到0,判断最大值(eg:-1,0,-2),curval =1,继续。
如果非0,那么curval 乘以该值,更新返回值。
从右遍历数组,重复4.5步,判断0就不要需要了。
#include <iostream> using namespace std; class Solution { public: int maxProduct(int A[], int n) { if(n<2) return A[0]; int retMax=A[0]; int curval=1; for(int i=0;i<n;i++){ if(A[i]==0){ if(0>retMax) retMax=0; curval=1; continue; } curval*=A[i]; if(curval>retMax) retMax=curval; } curval = 1; for(int i=n-1;i>=0;i--){ if(A[i]==0){ curval = 1; continue; } curval*= A[i]; if(curval>retMax) retMax= curval; } return retMax; } }; int main() { int a[]={-1,0,-2}; Solution sol; cout<<sol.maxProduct(a,sizeof(a)/sizeof(int))<<endl; return 0; }
View Code
官方解法中结合了求最小值的解答,是一个标准的dp 过程,
f(k) :0-th to k-th 的最大值
g(h):0-th to k-th 的最小值
那么有:
f(k) = max( f(k-1) * A[k], A[k], g(k-1) * A[k] )
g(k) = min( g(k-1) * A[k], A[k], f(k-1) * A[k] )
相关文章推荐
- LeetCode:152_Maximum Product Subarray | 最大乘积连续子数组 | Medium
- LeetCode:152_Maximum Product Subarray | 最大乘积连续子数组 | Medium
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
- Leetcode 152 Maximum Product Subarray 子数组最大乘积
- lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
- LeetCode 152. Maximum Product Subarray--连续子数组最大乘积
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
- LeetCode Maximum Product Subarray 最大子序列积
- Maximum Product Subarray:数组中最大连续区间求积
- LeetCode-Maximum Product Subarray-最大乘积子数组-情况判断
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
- Maximum Product Subarray 连续数组的最大乘积
- leetcode_Maximum Product Subarray _medium(最大子数组之积)
- leetcode152-Maximum Product Subarray(乘积最大子数组)
- LeetCode题库解答与分析——#152. 乘积最大子序列MaximumProductSubarray
- Maximum Subarray 最大子数组和(连续)@LeetCode
- LeetCode Maximum Product Subarray_DP_最大子数组
- LeetCode Maximum Product Subarray(最大子数组乘积)
- 【LeetCode-面试算法经典-Java实现】【152-Maximum Product Subarray(子数组的最大乘积)】