码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Maximum Product Subarray 连续数列最大积

时间:2014-12-06 15:19:13      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

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.

 

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的那个,便会有一部分是最大值。
    这样只要从左遍历一次,再从右遍历一次便能找出。
逻辑:
  1. 判断输入个数。
  2. 设初始值,当前计算值curval = 1.
  3. 从左遍历数组。
  4. 如果遇到0,判断最大值(eg:-1,0,-2),curval =1,继续。
  5. 如果非0,那么curval 乘以该值,更新返回值。
  6. 从右遍历数组,重复4.5步,判断0就不要需要了。
bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Solution {
 5 public:
 6     int maxProduct(int A[], int n) {
 7         if(n<2) return A[0];
 8         int retMax=A[0];
 9         int curval=1;
10         for(int i=0;i<n;i++){
11             if(A[i]==0){
12                 if(0>retMax)   retMax=0;
13                 curval=1;
14                 continue;
15             }
16             curval*=A[i];
17             if(curval>retMax)   retMax=curval;
18         }
19         curval = 1;
20         for(int i=n-1;i>=0;i--){
21             if(A[i]==0){
22                 curval = 1;
23                 continue;
24             }
25             curval*= A[i];
26             if(curval>retMax)   retMax= curval;
27         }
28         return retMax;
29     }
30 };
31 
32 int main()
33 {
34     int a[]={-1,0,-2};
35     Solution sol;
36     cout<<sol.maxProduct(a,sizeof(a)/sizeof(int))<<endl;
37     return 0;
38 }
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] Maximum Product Subarray 连续数列最大积

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/Azhu/p/4148248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!