3-2-子数组最大乘积

题目描述:

  给定一个double类型的数组arr,其中的元素可正可负可0,
  返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],
  子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

 1 /*
 2     思路:
 3         因为每个元素可正可负可0,所以在arr数组每个位置i处记录当前乘积的max和min,
 4         而位置i+1处乘积的max/min就只有三种可能:
 5             1) max*arr[i+1];
 6             2) min*arr[i+1];
 7             3) arr[i+1].
 8         因此每次在位置i处记录成绩的最大值并更新,最终返回即可。
 9 */
10 #include <iostream>
11 #include <vector>
12 #include <math.h>
13 using namespace std;
14 
15 double Max(double a, double b){
16     return a>b?a:b;
17 }
18 double Min(double a, double b){
19     return a<b?a:b;
20 }
21 double maxProduct(vector<double> arr){
22     if (arr.size() == 0)
23         return 0;
24     double max = arr[0];
25     double min = arr[0];
26     double res = max;
27     for (int i = 1; i < arr.size(); i++){
28         double maxa = max*arr[i];
29         double mina = min*arr[i];
30         max = Max(Max(maxa, mina), arr[i]);
31         min = Min(Min(maxa, mina), arr[i]);
32         res = Max(res, max);
33     }
34     return res;
35 }
36 
37 int main(){
38     vector<double> a;
39     /*a.push_back(-2.5);
40     a.push_back(4);
41     a.push_back(0);
42     a.push_back(3);
43     a.push_back(0.5);
44     a.push_back(8);
45     a.push_back(-1);*/
46     a.push_back(0.1);
47     a.push_back(0.0);
48     a.push_back(3);
49     a.push_back(-2.0);
50     a.push_back(0.9);
51     a.push_back(-1.3);
52     a.push_back(5.0);
53     a.push_back(-4.4);
54     cout << maxProduct(a) << endl;
55     return 0;
56 }

 

posted @ 2015-10-16 11:22  KindaCrazy  阅读(227)  评论(0编辑  收藏  举报