首页 > 编程语言 > 详细

3-2-子数组最大乘积

时间:2015-10-16 13:32:03      阅读:298      评论:0      收藏:0      [点我收藏+]

题目描述:

  给定一个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 }

 

3-2-子数组最大乘积

原文:http://www.cnblogs.com/qianmacao/p/4884780.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!