最大乘积

最大乘积

http://www.nowcoder.com/questionTerminal/5f29c72b1ae14d92b9c3fa03a037ac5f

题解

难度:简单

知识点:数学逻辑

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

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

所以找出最大三个正数和最小的两个负数这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 >> n;
    for(i = 0; i < n; i++)
    {
        cin >> num;
        if(num < min1)
        {
            min2 = min1;
            min1 = num;
        }
        else if(num < min2)
        {
            min2 = num;
        }

        if(num > max1)
        {
            max3 = max2;
            max2 = max1;
            max1 = num;
        }
        else if(num > max2)
        {
            max3 = max2;
            max2 = num;
        }
        else if(num > max3)
        {
            max3 = num;
        }
    }
    max_mul = max1*max2*max3 > max1*min1*min2 ? max1*max2*max3 : max1*min1*min2;
    cout << max_mul << endl;
    return 0;
}
全部评论
全部是负数是不是另一种情况
点赞 回复 分享
发布于 2022-05-01 17:52
如果序列为 -100, -99,-3,-2,-1,99,100按照上述思想,取最小的两个数以及最大的三个数做乘积,那么得到的结果是-9900,可这个序列的最大值乘积应该是-6,取-1,-2,-3
点赞 回复 分享
发布于 2022-05-02 11:01
要是输入存在重复元素,这个算法在处理最大的三个值和最小的三个值就会产生问题。代码健壮性还可以提高,只是本题好像不存在重复输入
点赞 回复 分享
发布于 2023-05-18 11:31 吉林

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
6 1 评论
分享
牛客网
牛客企业服务