牛客题解 | 最大乘积

题目

题目链接

题解

难度:简单

知识点:数学逻辑

最大值只能出现在以下两种情况的较大值:

  • 最大的三个正数的乘积
  • 最小的两个负数*最大的正数的乘积

所以找出最大三个正数和最小的两个负数这5个数即可
但是这道题要求时间复杂度o(n),但是空间复杂度o(1)
如果先把所有数存到数组中,然后排序找出这5个数,那么空间复杂度为o(n)
所以不能将全部数存到数组再排序,只能在输入的过程中就把最大的三个数和最小的两个数存起来,最后比较最大值的组合即可

#include<iostream>
#include<limits.h>
using namespace std;
int main()
{
    int i, n, num;
    long long max_mul;
    /* max1, max2, max3 分别为最大值,次大值,第三大值
     * min1, min2 分别为最小值,次小值*/
    long long max1, max2, max3, min1, min2;
    max1 = max2 = max3 = INT_MIN;
    min1 = min2 = INT_MAX;
    cin &gt;&gt; n;
    for(i = 0; i &lt; n; i++)
    {
        cin &gt;&gt; num;
        if(num &lt; min1)
        {
            min2 = min1;
            min1 = num;
        }
        else if(num &lt; min2)
        {
            min2 = num;
        }
         
        if(num &gt; max1)
        {
            max3 = max2;
            max2 = max1;
            max1 = num;
        }
        else if(num &gt; max2)
        {
            max3 = max2;
            max2 = num;
        }
        else if(num &gt; max3)
        {
            max3 = num;
        }
    }
    max_mul = max1*max2*max3 &gt; max1*min1*min2 ? max1*max2*max3 : max1*min1*min2;
    cout &lt;&lt; max_mul &lt;&lt; endl;
    return 0;
}

</limits.h>

posted @ 2025-03-07 11:17  wangxiaoxiao  阅读(15)  评论(0)    收藏  举报