首页 > 试题广场 >

子数组最大乘积

[编程题]子数组最大乘积
  • 热度指数:24199 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
给定一个double类型的数组arr,其中的元素可正可负可0,返回连续子数组累乘的最大乘积。

数据范围:数组大小满足 ,数组中元素满足
进阶:空间复杂度 ,时间复杂度
示例1

输入

[-2.5,4,0,3,0.5,8,-1]

输出

12.00000

说明

取连续子数组[3,0.5,8]可得累乘的最大乘积为12.00000 
示例2

输入

[1.0,0.0,0.0]

输出

1.00000

说明

取连续子数组[1.0]可得累乘的最大乘积为1.00000 
/**
 *
 * @param arr double浮点型一维数组
 * @param arrLen int arr数组长度
 * @return double浮点型
 */
double GetMax(double x1,double x2,double x3)
{
    double maxx = x1;
    if(maxx < x2) maxx = x2;
    if(maxx < x3) maxx = x3;
    return maxx;
}
double GetMin(double x1,double x2,double x3)
{
    double minx = x1;
    if(minx > x2) minx = x2;
    if(minx > x3) minx = x3;
    return minx;
}
double maxProduct(double* arr, int arrLen ) {
    // write code here
    if(0 == arrLen) return 0;
    double *maxa = (double*)malloc(arrLen*sizeof(double));
    double *mina = (double*)malloc(arrLen*sizeof(double));
    memset(maxa, 0, arrLen);
    memset(mina, 0, arrLen);
    maxa[0] = arr[0];
    mina[0] = arr[0];
   
   
    for(int i = 1; i < arrLen; i++)
    {
       
            maxa[i] = GetMax(arr[i], maxa[i-1]*arr[i], mina[i-1]*arr[i]);
            mina[i] = GetMin(arr[i], maxa[i-1]*arr[i], mina[i-1]*arr[i]);
       
    }
    double res = maxa[0];
    for(int i = 0; i < arrLen; i++)
    {
        if(res < maxa[i]) res = maxa[i];
    }
    return res;
}
发表于 2021-08-27 15:28:09 回复(0)

问题信息

难度:
1条回答 5802浏览

热门推荐

通过挑战的用户