求子数组的连续最大积---面试精选

来源:互联网 发布:iapp源码 编辑:程序博客网 时间:2024/05/29 19:12

这几天看到这个问题,然后在网上没能找到完整的答案,http://blog.csdn.net/kay_zhyu/article/details/8875031#cpp,作者kay_zhyu给出了不错的思路,而且针对大部分测试时都能给出正确的答案,但是在正负小数比较多时,有些结果不对。


其实质时,忽略了小数相乘时结果越来越小这个结论,当两个小数相乘时,乘积肯定没有当前这个数大,因而我们需要保留当前这个数作为最大的乘积。当然还要感谢kay_zhyu提供的思路。


下面给出完整并且正确的代码:

#include "stdafx.h"#include<iostream>using namespace std;#define Inf 1e5;double GetMaxProduct(double *arr, int nLen)  {      if(!arr || nLen < 1)          return -Inf;      if(nLen == 1)          return arr[0];      int i;      double ans = -Inf;      double Nag,Pos;      double temp;      Nag = Pos = 1;      for(i = 0; i < nLen; ++i)      {          if(arr[i] >= 0.0)          {              Nag *= arr[i];              Pos *= arr[i];          }          else          {              temp = Nag;              Nag = Pos * arr[i];              Pos = temp * arr[i];          }Pos = max(Pos,arr[i]);Nag = min(Nag,arr[i]);        ans = max(ans, Pos);          if(Nag > 0)              Nag = 1;          if(Pos < 0)              Pos = 1;    }      return ans;  }  double max(const double a, const double b)  {  return a > b ? a : b;  }double min(const double a, const double b)  {  return a < b ? a : b;  }int main()  {      const int N = 30;  double arr[N]={0.5,0.8,-0.6,0.7,-0.7}; //0.8//double arr[N]={2,-0.5,0.7,4,-6};//16.8//double arr[N]={-2,3,4,-3,-4};//144//double arr[N]={2,3,4,-5,-6};    double n = GetMaxProduct(arr,5);cout<<n<<endl;    return 0;}  

当然我们使用动态规划的话,那就更容易了,每次维护最大值和最小值,将a[i]乘上去,再更新最大最小值即可。

double MaxProduct(double* arr, double len)  {      double dp1 = arr[0];      double dp2 = arr[0];      double largest = arr[0];      for (int i = 1; i < len; ++i)      {          double tmp1 = dp1*arr[i];          double tmp2 = dp2*arr[i];          dp1 = max(max(tmp1,tmp2),arr[i]);        dp2 = min(min(tmp1,tmp2),arr[i]);        if(dp1 > largest) largest = dp1;      }      return largest;  }