首页 > 试题广场 >

三个数的最大乘积

[编程题]三个数的最大乘积
  • 热度指数:26288 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 的无序数组 ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。

要求时间复杂度: ,空间复杂度:

数据范围:


示例1

输入

[3,4,1,2]

输出

24
long long solve(int* A, int ALen ) 
{
    int i,j,temp;
    long produce;
    for(i=0;i<ALen-1;i++)
    {
        for(j=i+1;j<ALen;j++)
        {
            if(A[i]>A[j])
            {
                temp = A[i];
                A[i] = A[j];
                A[j] = temp;

            }
        }
    }

    if(A[ALen-2] * A[ALen-3]>=A[0] * A[1])
    {
        produce = (long) A[ALen-1] * A[ALen-2] * A[ALen-3];
        return produce;
    }
    else
    {
         produce = (long) A[0] * A[1] * A[ALen-1];
        return produce;
    }
}

发表于 2022-10-11 22:59:39 回复(0)
思路:先快排对数组排序
int i, j;
void QuickSort(int* a, int left, int right)
{
    int tmp, t;
    if (left>right) return;
    tmp = a[left];
    i = left, j = right;
    while (i != j)
    {
        while (a[j] >= tmp && i < j)
        {
            j--;
        }
        while (a[i] <= tmp && i < j)
        {
            i++;
        }
        if (i < j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[left] = a[i];
    a[i] = tmp;
    QuickSort(a, left, i - 1);
    QuickSort(a, i + 1, right);
}
long long solve(int* A, int ALen ) {
    QuickSort(A,0,ALen-1);
    long long max1=A[ALen-1],max2=A[ALen-2],max3=A[ALen-3];
    long long min1=A[0],min2=A[1];
    if(min1<0&&min2<0)
    {
        if((-min1>A[ALen-2]||-min1>A[ALen-3])&&(-min2>A[ALen-2]||-min2>A[ALen-3]))
        {
            return A[ALen-1]*min1*min2;
        }
    }
    return max1*max2*max3;
}
发表于 2022-06-09 12:15:09 回复(0)
long long solve(int* A, int ALen ) {
    // write code here
    for(int i = 0; i < ALen; i++)
    {
        for(int j = 0; j < ALen -i -1; j++)
        {
            if(A[j] > A[j+1])
            {
                int temp = A[j];
                    A[j] = A[j+1];
                    A[j+1] = temp;
            }
        }
    }
    for(int i = 0; i < ALen; i++)
    {
        printf("A= %d\n",A[i]);
    }
    long long k = A[ALen-1]*A[ALen-2]*A[ALen-3];
    long long m = A[ALen-ALen]*A[ALen-(ALen-1)]*A[ALen-1];
    printf("k= %lld\n",k);
    printf("m= %lld\n",m);
    if(k > m)
    return k;
    else
        return m;
}
[3472,7789,7955,-7098,-9281,6101,5051,7778,3090,7423,-7151,5652,1595,-8094,677,-8324,8347,-2482,9313,-9338,-3157,8559,6945,3618,3087,121,-8468,3225,1356,6939,2799,-7231,-6309,-5453,633,-8689,-4776,2714,-2743,-1409,5918,-3333,1803,8330,-2206,-6117,-4486,-7903,-4375,-3739,2897,8056,-5864,-522,7451,-4541,-2813,5790,-532,-6517,925]
k= 665339094549
m= -333598534

m= -333598534哪位大佬可以给小弟指导一下怎么回事,博学尚浅实在想不出来


发表于 2021-07-30 16:46:44 回复(1)

问题信息

上传者:牛客332641号
难度:
3条回答 4783浏览

热门推荐

通过挑战的用户

查看代码